Назначение 2d динамической строки в 1d массив - PullRequest
0 голосов
/ 28 апреля 2011

Я пытаюсь присвоить значения i-й строки массива 2d массиву 1d. Эти массивы создаются динамически. Мой код:

#include <stdio.h>
#include <stdlib.h>

#define N 10
#define FRAC 10

int main(int argc, char *argv[]){

    int i, j;
    double **A, *B;

    A=(double**)malloc(sizeof(double)*N);
    for (i=0; i<N; i++){
        A[i]=(double*)malloc(sizeof(double)*N);
    }

    for (i=0; i<N; i++){
        for(j=0; j<N; j++){
            A[i][j]=i*j/FRAC;
        }
    }

    B=A[0];

    for(i=0; i<N; i++)
        printf("%f\n",B[i]);

    system("PAUSE");

    return 0;
}

Когда печатается B, все значения отображаются как 0,0000. В чем здесь проблема?

Ответы [ 2 ]

3 голосов
/ 28 апреля 2011

Если вы посмотрите на свой цикл:

for (i=0; i<N; i++){
    for(j=0; j<N; j++){
        A[i][j]=i*j/FRAC;
    }
}

Вы увидите, что каждый элемент в A[0] включает умножение на i == 0, поэтому ваш B будет равен нулю.

Если вы назначите B = A[1] и переведите вычисления в режим с плавающей запятой, задав для FRAC значение 10.0 (или добавив явные приведения), вы увидите нечто более интересное из цикла printf.

И, пока я здесь, пожалуйста, не приводите возвращаемое значение из malloc, в этом нет необходимости, и оно часто скрывает ошибки. Вы также неправильно распределяете A, вы должны делать A = malloc(sizeof(double *) * N); к счастью для вас, double почти всегда, по крайней мере, такой же большой, как указатель.

Это модифицированная версия вашей программы:

#include <stdio.h>
#include <stdlib.h>

#define N 10
#define FRAC 10.0   /* CHANGED */

int main(int argc, char *argv[]) {
    int i, j;
    double **A, *B;

    A = malloc(sizeof(double *) * N);
    for(i = 0; i < N; i++) {
        A[i] = malloc(sizeof(double) * N);
    }

    for(i = 0; i < N; i++) {
        for(j = 0; j < N; j++) {
            /* This is floating point now that FRAC is 10.0 */
            A[i][j]= i * j / FRAC;
        }
    }

    B = A[1];   /* A[0] is all 0.0 so we'll look at A[1] instead. */
    for(i = 0; i < N; i++)
        printf("%f\n", B[i]);

    return 0;
}

Произведите следующее (что более интересно и поучительно, чем набор нулей):

0.000000
0.100000
0.200000
0.300000
0.400000
0.500000
0.600000
0.700000
0.800000
0.900000
1 голос
/ 28 апреля 2011

Оба i*j и FRAC являются целыми числами, а в C деление двух целых чисел приводит к целому числу, отбрасывая любые десятичные дроби, которые вы обычно имели бы.

Измените FRAC на явное значение с плавающей точкой, например используя 10.0 вместо 10.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...