Увеличение указателя на массив в структуре - PullRequest
1 голос
/ 03 января 2012

У меня возникли некоторые проблемы с этим, и я искал в Интернете «высоко» и «низко», но безрезультатно. Я в основном пытаюсь создать случайную матрицу и распечатать ее, у меня есть функция double random(), которая работает и была протестирована, и я определил структуру следующим образом:

    typedef struct matrep {
         unsigned rows, columns;
         double *data;
    } MATRIX;

, для которого я правильно выделил память, я использую эту и мою случайную функцию для создания случайной матрицы, но в результате получается, что указатель никогда не перемещается,

MATRIX *rand_matrix( MATRIX *mat ) 
{
    for ( int i=0; i < mat->rows; i++ )
    {
        for ( int j=0; j < mat->columns; j++ )
        {
             *(mat->data) = random() ;
        }
    }
    return mat ;
}

Я знаю, что он никогда не движется, потому что, когда я распечатываю матрицу, используя эту функцию

void print_matrix(MATRIX *mat ) 
{
    int i, j ;
    if ( (mat->data)==0 || (mat->rows)==0 || (mat->columns)==0 )
    {
        printf("Empty matrix\n" );
        return ;       
    }
    printf( "\n\nMatrix of dimensions %d x %d\n\n", mat->rows, mat->columns) ;
    for ( i=0; i < mat->rows; i++ )
    {
        for ( j=0; j < mat->columns; j++ )
        {
            printf("\t%1.2lf", *(mat->data) );
        }
        printf("\n") ;
    }
}

и обмен случайным образом в вышеприведенной матрице с 'j', в результате получается матрица с правильным количеством строк и столбцов, но каждое значение равно наибольшему значению j.

По сути, я надеялся, что вы сможете мне помочь, - это выяснить, как увеличить мой *(mat->data) указатель. Я слышал кое-что о том, что когда вы вызываете оператор стрелки, он автоматически увеличивается, но, похоже, он не работает, и когда я пытаюсь *(mat->data)++, я получаю довольно большую ошибку.

Любая помощь была бы велика, спасибо миллион.

Ответы [ 4 ]

4 голосов
/ 03 января 2012

Вы на самом деле не хотите менять mat->data;вам нужно, чтобы он продолжал указывать на правильно распределенную память.Вместо этого вам нужно изменить это:

         *(mat->data) = random() ;

на что-то вроде этого:

         mat->data[i * mat->columns + j] = random() ;

(чтобы обратиться к i * mat->columns + j th double в блоке памяти, указанном наmat->data), и это:

      printf("\t%1.2lf", *(mat->data) );

примерно так:

      printf("\t%1.2lf", mat->data[i * mat->columns + j]);

(аналогично).

Я слышал кое-что о том, когдаВы вызываете оператор стрелки, он автоматически увеличивается […]

Это не так, и я даже не могу вспомнить ничего подобного, что вы, возможно, слышали, извините.


Отредактировано, чтобы добавить: Другой подход, если вы предпочитаете, это написать что-то вроде этого:

MATRIX *rand_matrix( MATRIX *mat ) 
{
    double *pTmp = mat->data;
    for ( int i=0; i < mat->rows; i++ )
    {
        for ( int j=0; j < mat->columns; j++ )
        {
             *(pTmp++) = random() ;
        }
    }
    return mat ;
}

, который увеличивает указатель pTmp на все элементы.Я не знаю, какой подход более понятен.Но в любом случае, я не думаю, что это хорошая идея изменить mat->data.

0 голосов
/ 03 января 2012

В основном для хранения матрицы с использованием массива необходимо выделить память, которая близко имитирует двумерную матрицу, то есть к каждому элементу матрицы (или массива) нужно обращаться уникально, используя разные значения для rows в columns.

Вы можете сделать это в C разными способами. Но следующее является одним из наиболее распространенных способов сделать то же самое. Этого не хватает для перераспределения, то есть free(). Пожалуйста, попробуйте сделать это сами, и мы здесь, если вам нужна помощь!

ПРИМЕЧАНИЕ. Я вижу, что в вашем коде должно быть сделано несколько изменений ... и поэтому я пытаюсь предоставить общие рекомендации и ссылку в качестве ответа!

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

int main()
{
        int row, column;
        int **matrix;
        int i, j, val;

        printf("Enter rows: ");
        scanf("%d", &row);
        printf("Enter columns: ");
        scanf("%d", &column);

        matrix = (int **) malloc (sizeof(int *) * row);
        for (i=0 ; i<row ; i++) 
                matrix[i] = (int *) malloc (sizeof(int) * column);

        val=1;
        for (i=0 ; i<row ; i++) {
                for (j=0 ; j<column; j++) {
                        matrix[i][j] = val++;
                }
        }

        for (i=0 ; i<row ; i++) {
                for (j=0 ; j<column; j++) {
                        printf("%3d  ", matrix[i][j]);
                }
                printf("\n");
        }

        return 0;
}
0 голосов
/ 03 января 2012

Здесь: `printf (" \ t% 1.2lf ", * (mat-> data)); ' Вы всегда указываете на одну и ту же память.

Вы можете использовать оператор [] для индексации и разыменования указателя, например:

(mat->data)[2]

0 голосов
/ 03 января 2012

Вы должны сделать mat-> data ++. (mat-> data) ++ оценивает значение mat-> data и пытается увеличить его, что невозможно.

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