2010-05-08 3 views
1

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

void funcA(PEOPLE people[], int *total) 
{ 
    FILE *fp; 
    char line[100]; 
    fp = fopen("example.txt", "r"); 
    if (fp == NULL) { 
    exit(1); 
    } 

    else { 
    fgets(line, 100, fp); //get a number from the txt 
    total = atoi(line); //convert to int 
    } 
} 

void funcB(PEOPLE people[], int *total) 
{ 
    int i; 
    for (i = 0; i < total; i++) { 
    printf("%s\n", people[i].name); 
    } 
    funcA(people, &total); 
} 

void main() 
{ 
    PEOPLE people[100]; 
    int *total; 
    funcB(people, &total); 
} 

Что я делаю неправильно? Мне нужно значение от total, чтобы делать cicle;

+1

Пожалуйста, правильно отпечатайте свой код. – Javier

+1

Если я не читаю это неправильно, не уверен, что это даже компилируется. Конечно, я не написал пролив C через некоторое время. Таким образом, вы передаете массив PERSON в метод, который принимает массив PEOPLE. Кроме того, вы делаете atoi в linha, который я не вижу нигде. Что такое массив, который используется для фактического использования. Функция funcA не использует его. Поэтому, я думаю, мой вопрос - это то, что вы пытаетесь выполнить, и что ваш код не делает? –

ответ

1

Во-первых, вы должны позвонить funcA из funcB, как это:

funcA(people, total); 

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

int funcA(PEOPLE people[], int *total){ 
    int ret; 
    // set ret to desired value 
    return ret; 
} 
... 
int value = funcA(people, total); 

После сортировки это, необходимо правильно инициализировать переменные, рассортировать называние расхождение (Linha против линии, ЛЮДИ против человека) и все другие вопросы, отмеченных другими.

0

Здесь существует множество проблем (общее количество указателей, для цикла на указателе, никогда не инициализировано ничем и т. Д. И т. Д.).

Чтобы ответить на ваш вопрос, функции имеют возвращаемые типы:

int foo(void) { 
    return 3; 
} 

int main(int argc, char**argv) { 
    printf("Foo returned %d\n", foo()); 
    return 0; 
} 

В этом случае обув возвращает int. Вы возвращаете значения с ключевым словом return.

Вы также можете вернуть данные в указателях:

void foo(int* c) { 
    *c = 3; 
} 

int main(int argc, char**argv) { 
    int h; 
    foo(&h); 
    printf("Foo returned %d\n", h); 
    return 0; 
} 

Это полезно, если у вас есть несколько значений, чтобы вернуться.

0

О, мальчик!

Прежде всего, что вы делаете правильно или, по крайней мере, так кажется. Вы привлекаете внимание и получаете баллы за upvotes, несмотря на то, что код выглядит как введенный непосредственно в поле редактора в Stackoverflow и никогда не проверяется ни с каким компилятором. Хорошая работа :)

Теперь что случилось. Список длинный, но некоторые советы

void main() 
{ 
    PERSON person[100]; 
    int *total; 
    funcB(people, &total); 
} 

void funcB(PEOPLE people[], int *total); 

Было бы хорошо, если бы Вы показали нам определение (возможно) структуры НАРОДА и PERSON. В коде мы видим, что нет определения людей - переменной, которую вы передаете funcB. Вы определяете указатель на int-total и не инициализируете его. Затем вы передаете адрес этого указателя на funcB, который принимает int * not int ** как второй аргумент. Эти типы несовместимы.

void funcB(PEOPLE people[], int *total) 
{ 
    int i; 
    for (i = 0; i < total; i++) { 
     printf("%s\n", people[i].name); 
    } 
    funcA(people, &total); 
} 

void funcA(PEOPLE people[], int *total) 

Вы используете указатель в условии цикла вместо указанного значения. Нет значения, потому что вы не инициализировали указатель в основном, но здесь у вас есть несовместимые типы в состоянии. Вы передаете адрес указателя на funcA вместо указателя, как в основном.

void funcA(PEOPLE people[], int *total) 
{ 
    FILE *fp; 
    char line[100]; 
    fp = fopen("example.txt", "r"); 
    if (fp == NULL) { 
     exit(1); 
    } 

    else { 
     fgets(line, 100, fp); //get a number from the txt 
     total = atoi(linha); //convert to int 
    } 
} 

используется неопределенный символ «Linha» - я думаю, что это опечатка в «линии». Затем вы назначаете int указателю вместо int, на который указывает этот указатель.

+0

Как я ориентирую указатель в основном? – Pedro

+0

Указатель должен указывать на что-то. Это указатель на int, поэтому он должен указывать на некоторую переменную int. Определите переменную int и установите для нее указатель. int myintvar; int * mypointer = & myintvar; –

+0

и как насчет вызова функции? – Pedro

0

Проверьте это:

  1. exit() функция вышла из программы, а не только от функции. Вы можете использовать return; для возврата из функции.
  2. total не инициализируется, когда вы используете это. Используйте строку funcA(people, &total); перед циклом for в вашей функции funcB.
Смежные вопросы