Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
1

Динамическая память. Ошибка С2143 пишет отсутствие ";" перед "тип" (Visual Studio 2010)

20.06.2012, 23:48. Показов 2439. Ответов 8
Метки нет (Все метки)

Это код filesIO.c

Чтение данных для выч. модуля программы из файла (вектора X, чисел N, M; inNm - имя файла).

Там 2 строчки вместе образуют ошибку компиляции (обозначенно комментом). Если комментировать одну строчку (любую из них), ошибки нет. Но вместе почему-то ошибка. Не понимаю, что не так?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <stdio.h>
#include "filesIO.h"
 
int readIn(char* inNm, float** X, int* N, int* M)
{
    FILE* FL=fopen(inNm,"r");
    if(FL)
    {
        if (fscanf(FL,"#begin file\n")==EOF)
        {
            fclose(FL);
            return 1;
        }
        else
        {
            if (fscanf(FL,"N=%u;\n",N)==EOF)
            {
                fclose(FL);
                return 1;
            }
            else
            {
                if (fscanf(FL,"M=%u;\n",M)==EOF)
                {
                    fclose(FL);
                    return 1;
                } 
                else
                {                   
                    if (fscanf(FL,"x[i]:\n")==EOF)
                    {
                        fclose(FL);
                        return 1;
                    } 
                    else
                    {
                        *X=malloc(sizeof(float)*(*N-1));//ОШИБКА КОМПИЛЯЦИИ                     
                        float* rowX=*X;//ОШИБКА КОМПИЛЯЦИИ
                        /*
                        for (int xCnt=0; xCnt<=*N-1; xCnt++)
                        {
 
                        }
                        */
                    }
                }
            }
        }
    }
    else
    {
        return 1;
    }
}
Добавлено через 1 минуту
В файле filesIO.h только сигнатура этой функции.
0
Заказывайте контрольные, курсовые и дипломы здесь.
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.06.2012, 23:48
Ответы с готовыми решениями:

Синтаксическая ошибка: отсутствие ";" перед "тип"
Всем привет. Почему когда создаю переменную после scanf дает error. А если объявлять 'aaa' верху...

Синтаксическая ошибка: отсутствие "; " перед "тип"
подскажите в настройке visual studio 2008 #include &lt;stdio.h&gt; #define SIZE 10 int* getMaxMin(int...

Ошибка в 3 строчках: Синтаксическая ошибка: отсутствие ";" перед "тип"
Вот написал я: #include &quot;locale.h&quot; int main() { setlocale(LC_ALL, &quot;&quot;); char *str =...

Error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "A"
пишет: (20): error C2146: синтаксическая ошибка: отсутствие &quot;;&quot; перед идентификатором &quot;A&quot; (27):...

8
Заблокирован
21.06.2012, 00:16 2
fscanf
Виктор_Сен, какая ошибка? по большому счету строки правильные. Вот
пример
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <stdlib.h>
 
#define n   ( 4 )
 
void set_mem( int **x ) {
 
    *x = malloc( sizeof( int ) * n );
}
 
int main () {
 
    int *x;
    unsigned short i = n;
 
    set_mem( &x );
 
    while ( i-- ) {
        x[ i ] = i;
        printf( "%3d", x[ i ] );
    }
 
    free( x );
    return 0;
}
, аналогичный твоему, компилится даже без варнингов, работает как положено.
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10914 / 6840 / 1625
Регистрация: 25.07.2009
Сообщений: 12,544
21.06.2012, 01:44 3
Цитата Сообщение от Виктор_Сен Посмотреть сообщение
if (fscanf(FL,"#begin file\n")==EOF)
Это что за абстракционизм? Что, и главное - куда прочитаться-то должно?
0
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
21.06.2012, 08:16  [ТС] 4
Цитата Сообщение от easybudda Посмотреть сообщение
Это что за абстракционизм? Что, и главное - куда прочитаться-то должно?
Это надо просто строчку такую пропустить, тут не читается ничего, дальше читается. Так можно. Просто если пользователь случайно не тот файл в консоли введёт, это небольшая защита, в постороннем файле вряд-ли будет такая строчка в начале... Если не понравится, можно убрать. Ни какого особого смысла тут нету. Только для красоты, что типа все файлы имеют строку #begin file.
0
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
21.06.2012, 08:29  [ТС] 5
Цитата Сообщение от alkagolik Посмотреть сообщение
fscanf
Виктор_Сен, какая ошибка? по большому счету строки правильные. Вот
пример
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <stdlib.h>
 
#define n   ( 4 )
 
void set_mem( int **x ) {
 
    *x = malloc( sizeof( int ) * n );
}
 
int main () {
 
    int *x;
    unsigned short i = n;
 
    set_mem( &x );
 
    while ( i-- ) {
        x[ i ] = i;
        printf( "%3d", x[ i ] );
    }
 
    free( x );
    return 0;
}
, аналогичный твоему, компилится даже без варнингов, работает как положено.
Так вот по этому и обращаюсь за помощью, поскольку не понимаю, где Visual Studio находит ошибку. Вот скрин.
0
Миниатюры
Динамическая память. Ошибка С2143 пишет отсутствие ";" перед "тип" (Visual Studio 2010)  
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
21.06.2012, 08:55  [ТС] 6
alkagolik, ваш пример компилируется. Ладно, попробую создать новый проект, и вставлять по строчке. Бывает, глючит. Ребилд с удалением всего откомпиленного не помогает
0
Эксперт С++
5025 / 2604 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
21.06.2012, 10:26 7
Виктор_Сен, Вы бы подключили stdlib.h для верности.
0
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
21.06.2012, 12:34  [ТС] 8
Нет, не помогает. И если добавить к коду строку int* rowX=*x; вот так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <stdlib.h>
 
#define n   ( 4 )
 
void set_mem( int **x ) {
 
    *x = malloc( sizeof( int ) * n );
    int* rowX=*x;//Строка с ошибкой
}
 
int main () {
 
    int *x;
    unsigned short i = n;
 
    set_mem( &x );
 
    while ( i-- ) {
        x[ i ] = i;
        printf( "%3d", x[ i ] );
    }
 
    free( x );
    return 0;
}
, то Ваш код тоже не компилится

Добавлено через 1 минуту
И stdlib.h не помогает

Добавлено через 16 минут
Вот так вроде компилится:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <stdio.h>
#include <stdlib.h>
#include "filesIO.h"
 
int readIn(char* inNm, float** X, int* N, int* M)
{
    FILE* FL=fopen(inNm,"r");
    if(FL)
    {
        if (fscanf(FL,"#begin file\n")==EOF)
        {
            fclose(FL);
            return 1;
        }
        else
        {
            if (fscanf(FL,"N=%u;\n",N)==EOF)
            {
                fclose(FL);
                return 1;
            }
            else
            {
                if (fscanf(FL,"M=%u;\n",M)==EOF)
                {
                    fclose(FL);
                    return 1;
                } 
                else
                {                   
                    if (fscanf(FL,"x[i]:\n")==EOF)
                    {
                        fclose(FL);
                        return 1;
                    } 
                    else
                    {   
                        float* rowX=malloc(sizeof(float)*(*N-1));
                        *X=rowX;                        
                        /*
                        for (int xCnt=0; xCnt<=*N-1; xCnt++)
                        {
 
                        }
                        */
                    }
                }
            }
        }
    }
    else
    {
        return 1;
    }
}
Но почему не компилился первый вариант, я так и не понял. Только поменял строчки местами, и всё...

Добавлено через 2 минуты
Хотя наверно лучше всё-таки писать float* rowX=(float*)malloc(...) для совместимости с C++

Добавлено через 13 минут
Но когда я продолжил код, начав работать с rowX, снова компилятор стал выёживаться:
C
1
2
3
4
5
6
7
8
9
10
11
                        float* rowX=(float*)malloc(sizeof(float)*(*N-1));
                        *X=rowX;                        
                        for (int xCnt=0; xCnt<=*N-1; xCnt++)
                        {                           
                            if(fscanf(FL,"%f;\n",rowX)==EOF)
                            {
                                fclose(FL);
                                return 1;
                            }                           
                            rowX++;
                        }
Ошибка 6 error C2143: синтаксическая ошибка: отсутствие ";" перед "тип" d:\documents\¦ store\programming\visual studio 2010\vases\vases\filesio.c 40 1 Vases
Ошибка 7 error C2143: синтаксическая ошибка: отсутствие ";" перед "тип" d:\documents\¦ store\programming\visual studio 2010\vases\vases\filesio.c 40 1 Vases
Ошибка 8 error C2143: синтаксическая ошибка: отсутствие ")" перед "тип" d:\documents\¦ store\programming\visual studio 2010\vases\vases\filesio.c 40 1 Vases
Ошибка 9 error C2143: синтаксическая ошибка: отсутствие ";" перед "тип" d:\documents\¦ store\programming\visual studio 2010\vases\vases\filesio.c 40 1 Vases
Ошибка 10 error C2065: xCnt: необъявленный идентификатор d:\documents\¦ store\programming\visual studio 2010\vases\vases\filesio.c 40 1 Vases
Ошибка 12 error C2065: xCnt: необъявленный идентификатор d:\documents\¦ store\programming\visual studio 2010\vases\vases\filesio.c 40 1 Vases
Ошибка 13 error C2059: синтаксическая ошибка: ) d:\documents\¦ store\programming\visual studio 2010\vases\vases\filesio.c 40 1 Vases
Ошибка 14 error C2143: синтаксическая ошибка: отсутствие ";" перед "{" d:\documents\¦ store\programming\visual studio 2010\vases\vases\filesio.c 41 1 Vases

Добавлено через 11 минут
Даже такой код не компилится
C
1
2
3
4
5
6
7
8
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    printf("Hello, world!\n");
    float* x=(float*)malloc(8);
}
Ошибка 1 error C2143: синтаксическая ошибка: отсутствие ";" перед "тип" d:\documents\¦ store\programming\visual studio 2010\vases\vases\main.c 7 1 Vases

Добавлено через 1 час 13 минут
Вот, нашёл в MSDN решение проблемы. Оказывается, микрософтовские разработчики решили спародировать Delphi, цитата:
В программе C переменные необходимо объявлять в начале функции; после того, как функция выполняет не связанные с объявлением инструкции, объявлять переменные нельзя.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
// C2143j.c
 
int main() 
 
{
 
 int i = 0;
 
 i++;
 
 int j = 0; // C2143
 
}
Вот с учётом этого я переписал код так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <stdio.h>
#include <stdlib.h>
#include "filesIO.h"
 
int readIn(char* inNm, float** X, int* N, int* M)
{
    FILE* FL=fopen(inNm,"r");
    if(FL)
    {
        if (fscanf(FL,"#begin file\n")==EOF)
        {
            fclose(FL);
            return 1;
        }
        else
        {
            if (fscanf(FL,"N=%u;\n",N)==EOF)
            {
                fclose(FL);
                return 1;
            }
            else
            {
                if (fscanf(FL,"M=%u;\n",M)==EOF)
                {
                    fclose(FL);
                    return 1;
                } 
                else
                {
                        
                    if (fscanf(FL,"x[i]:\n")==EOF)
                    {
                        fclose(FL);
                        return 1;
                    } 
                    else
                    {
                        float* rowX;
                        int xCnt;
                        *X=(float*)malloc(sizeof(float)*(*N-1));                        
                        rowX=*X;                        
                        for (xCnt=0; xCnt<=*N-1; xCnt++)
                        {
                            if(fscanf(FL,"%f;\n",rowX)==EOF)
                            {
                                fclose(FL);
                                free(*X);
                                return 1;
                            }
                            rowX++;
                        }
                        fclose(FL);
                        return 0;
                    }
                }
            }
        }
    }
    else
    {
        return 1;
    }
}
И если переменную цикла объявлять прямо в цикле или присваивать значение rowX после начала других операций, даже не связанных с этой, он будет ругаться. Да, неисповедимы пути микрософта по втыканию палок в колёса труда программистов...

Добавлено через 6 минут
http://msdn.microsoft.com/ru-r... .100).aspx
0
Заблокирован
21.06.2012, 14:51 9
Перевести программу из C++ в Си
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.06.2012, 14:51

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Создать запись "Двигатель", которая содержит элементы "Название", "Мощность", "Скорость", "Цена"
Создать запись &quot;Двигатель&quot;, которая содержит элементы &quot;Название&quot;, &quot;Мощность&quot;, &quot;Скорость&quot;,...

Структура "двоичное дерево", ошибка "неполный тип"
Вот структура узла: typedef struct node { char* info; int key; ...

For(auto const& val : stime) .cpp(47) : error C2143: синтаксическая ошибка: отсутствие "," перед ":"
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;stdexcept&gt; #include &lt;locale&gt; #include...

error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "fprot"
помогите, пожалуйсти исправить ошибки!!! #include &lt;iostream&gt; #include &lt;fstream&gt; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.