2010-11-07 2 views
2
struct aPoint { 
     int somaVertical; 
     int somaHorizontal; 
     int valor; 
}; 

У меня есть массив структур динамически создаваемых в основной(), например так:Передача динамического-структуру массива с помощью функции

struct aPoint *ps = malloc(sizeof(struct aPoint) * columns * rows) 

И я хочу, чтобы работать со своими значениями STRUCT вне от основной () в функции, которая имеет sscanf(). Инициализация массива также равна позаботился из основного().

Как я могу передать в массиве структур через эту функцию и установить некоторые структуры значение этого Aswell? Argh ненавижу pointering!

Спасибо!

+5

+1 для чеканки термин "pointering" :) –

+1

Почему вы умножив размер по colunas и Linhas? Это даст вам массив структур, а не только один. –

+0

Так как мне нужен массив структур: P – Qosmo

ответ

5

Это было бы:

int readStuff(struct aPoint *ps, size_t len, const char *someVar) 
    { 
     unsigned int i; 
     for (i = 0; i < len; i++) { 
      sscanf(someVar, "%d", &(ps[i].somaVertical)); 
      /* And so on for the other fields */ 
     } 
     /* Return whatever you're returning here */ 
    } 

    const size_t len = colunas * linhas; 
    struct aPoint *ps = calloc(len, sizeof(struct aPoint)); 
    int success = readStuff(ps, len, arrayOfNumbers); 
+0

Большинство ответов были довольно хорошими и работали. Я просто выбираю ту, у которой больше болей. Спасибо всем за помощь. – Qosmo

0

Все функции в C передаются аргументы по значению, так что вы можете передать указатель на массив STRUCT вы хотите изменить:

int readStuff(struct aPoint *p, int numStruct) 
{ 
    ... 
    for(i=0; i<numStruct; i++) 
    { 
     sscanf(someVar, "%d", &(*(p+i).valor)); 
    } 
    ... 
} 

Вы можете позвонить эта функция:

struct aPoint *ps = malloc(sizeof(struct aPoint) * columns * rows); 
... 
readStuff(ps, columns * rows); 
+0

Я отредактировал свое оригинальное сообщение, пожалуйста, прочитайте. – Qosmo

+0

@Queops, извините за задержку, я отредактировал ответ соответственно. – 2010-11-10 08:23:44

0

Я думаю, вам нужно либо

readStuff(ps); 
... 
sscanf(someVar, "%d", &(ps[index].valor)); // using index in readStuff 

или

readStuff(ps + index); // using index in main 
... 
sscanf(someVar, "%d", &(ps->valor)); // or &ps[0].valor, that's equivalent 
3

Это работает для меня

/* #include <assert.h> */ 
#include <stdio.h> 
#include <stdlib.h> 

struct aPoint { 
    int somaVertical; 
    int somaHorizontal; 
    int valor; 
}; 

int readStuff(struct aPoint *data, int rows, int cols) { 
    sscanf("42", "%d", &data[3].somaVertical); 
    sscanf("142", "%d", &data[3].somaHorizontal); 
    sscanf("-42", "%d", &data[3].valor); 
    return 0; 
} 

int main(void) { 
    struct aPoint *ps; 
    int colunas, linhas; 

    colunas = 80; 
    linhas = 25; 
    ps = malloc(sizeof *ps * colunas * linhas); 
    /* assert(ps); */ /* thanks Tim */ 
    if (ps) { 
    readStuff(ps, linhas, colunas); 
    printf("%d %d %d\n", ps[3].somaVertical, ps[3].somaHorizontal, ps[3].valor); 
    free(ps); 
    } else { 
    fprintf(stderr, "no memory.\n"); 
    exit(EXIT_FAILURE); 
    } 
    return 0; 
} 
+2

Почему утверждение вместо явной проверки 'malloc()' fail? Вы знаете, что возвращает 'malloc()', когда он терпит неудачу. Зачем утверждать, если не проверить условие, которое может произойти за пределами возврата функции? Например, 'assert (i! = 3);' .. Ваш пример означает, что что-то вроде «NDEBUG» отключает проверку отказа «malloc()», поэтому утверждения иногда классифицируются как зло. –

+0

@Tim: +1 ...Я просто добавил assert (и бесплатный), потому что я всегда говорю «проверьте возвращаемое значение malloc», и я не смог сделать это в этом сообщении. Спасибо, что указали это; Я редактирую сообщение – pmg

+0

, это ответ занял время и является самым полезным до сих пор. +2 если бы я мог, так как вы сделали ваш пример совпадением с комментариями под ним :) –

Смежные вопросы