2016-04-13 19 views
1

У меня возникают две ошибки компиляции при попытке скомпилировать мой код, и я не могу найти, в чем проблема. Может ли кто-нибудь помочь пролить свет?Ошибка «объявления стиля старого стиля»

error: old-style parameter declarations in prototyped function definition 
error: 'i' undeclared (first use in this function) 

Код:

void printRecords (STUREC records[], int count) 

STUREC records[ARRAY_MAX]; 
int count; 
int i; 
{ 
    printf("+---------------------------+--------+--------+--------+--------+--------+--------+---------+-------+\n"); 
    printf("| Student Name | ID | Test 1 | Test 2 | Proj 1 | Proj 2 | Proj 3 | Average | Grade |\n"); 
    printf("+---------------------------+--------+--------+--------+--------+--------+--------+---------+-------+\n"); 

    for (i = 0; i < count; i++) 
    { 
     size_t j; 
     printf ("|%s|%d|%d|%d|%d|%d|%d|%f|%c|", records[i].name, records[i].id, records[i].score1, 
       records[i].score2, records[i].score3, records[i].score4, records[i].score5, 
        records[i].ave, records[i].grade); 
    } 

    return; 
} 
+2

выглядит так, как будто вы упустили '' 'скот в определении функции printRecords .. – jboockmann

+0

Открытие' {'должно следовать за списком параметров функции. –

+0

ах! спасибо вам, ребята ... теперь я получаю сообщение об ошибке, заявляя, что в моей функции «printRecords» count «переопределяется как другой вид sybole с запиской, в которой указано мое предыдущее определение. но у меня есть 'void printRecord (STUREC records [], int count)', за которым следует локальное объявление 'int count;' ... это две строки, на которые указывает код ошибки, но я имею их как в int, так что может быть ошибка? – seanncurtis

ответ

0

Вы

void printRecords (STUREC records[], int count) 

STUREC records[ARRAY_MAX]; 
int count; 
int i; 
{ 

Но я предполагаю, что вы хотите:

void printRecords (STUREC records[], int count) 
{ 
    int i; 

EDIT: Благодаря т о callyalater для отмечая переопределение параметров в функции ...

+0

Кроме того, 'i' не является параметром в' printRecords', а параметры старого стиля означают, что вы не помещаете тип в объявления параметров функции. – callyalater

+0

ах! спасибо вам, ребята ... теперь я получаю сообщение об ошибке, заявляя, что в моей функции «printRecords» count «переопределяется как другой вид sybole с запиской, в которой указано мое предыдущее определение. но у меня есть 'void printRecord (STUREC records [], int count)', за которым следует локальное объявление 'int count;' ... это две строки, на которые указывает код ошибки, но я имею их как в int, так что может быть ошибка? – seanncurtis

+0

@ mame98 Ваш пример не делает то, что вы думаете. Вы повторно объявляете параметры как локальные переменные, которые * скрывают * параметры и делают их недоступными для остальной части функции. – callyalater

0

Если вы хотите использовать old style C parameter declarations, что вам нужно сделать это:

void printRecords(records, count) 
    STUREC records[ARRAY_MAX]; 
    int count; 
{ 
    int i; 
    // ... rest of the code ... 
} 

Но это не считается хорошей практикой и может сделать ваш код сложнее читать. Некоторые компиляторы даже перестали поддерживать этот синтаксис.

Другие комментарии/ответы говорят о том, что вы повторно объявите (и, следовательно, спрячьте) свои функциональные параметры в теле функции, но это не то, что вы хотите сделать (иначе вы фактически потеряете параметры, являющиеся).

Если вы определяете функцию следующим образом:

void fxn(int num) { 
    int num; 
    num = num; 
} 

Что num см: параметр или локальной переменной?

Либо это сделать:

void printRecords(records, count) 
    STUREC records[ARRAY_MAX]; 
    int count; 
{ 
    int i; 
    // ... rest of the code ... 
} 

или сделать это:

void printRecords(STUREC records[], int count) 
{ 
    int i; 
    // ... rest of the code ... 
} 

Но не пытайтесь сделать оба или смесь из двух.

+0

да, я просто перевел мой ха-ха, и он позаботился об этом. im теперь имеет ошибку, заявив, что мой счет в printRecords обновляется как другой символ ... ошибка указывает на строки 98 и 94. любой ключ? – seanncurtis

+0

@seanncurtis Избавьтесь от строк сразу после '{', но до 'int i;'. См. Последний пример в моем ответе. – callyalater

+0

О, я вижу, если вы объявляете, что count является int в(), начиная с функции, вам не нужно объявлять это в локальных объявлениях? – seanncurtis

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