Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Raybek
0 / 0 / 0
Регистрация: 24.08.2013
Сообщений: 7
#1

Не могу объявить массив внутри main - ошибка при линковке - C++

24.08.2013, 16:28. Просмотров 987. Ответов 26
Метки нет (Все метки)

Доброго времени суток!

Я начинающий в С++. Использую gcc в Ubuntu 13.04 x64 bit.

Прохожу сейчас массивы. Заметил одну странность.
При попытке одновременного объвления
- массива внутри main
- и использования printf()
при компиляции выходит ошибка, я как понял линковщика, следующего содержания:
/tmp/ccXzvblP.o.eh_frame+0x13): undefined reference to `__gxx_personality_v0'
collect2: ошибка: выполнение ld завершилось с кодом возврата 1

Если по отдельности или выносить объявление массива до main, то компиляция идет без проблем.

Например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
int a[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17};
 
int main() {
    long int razmer=sizeof(a);
    long int dlina=razmer/sizeof(int);
 
    printf("В массиве 'a' %lu элемент(а,ов) \n",dlina);
 
    printf("Размер массива 'а' равен %lu Бт \n", razmer);
 
    //Выводим содержимое массива "а"    
    for (int i=0; i<dlina; ++i)
    {
        printf("Квадрат числа %u равен %u \n",a[i],a[i]*a[i]);
    };
    
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2013, 16:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не могу объявить массив внутри main - ошибка при линковке (C++):

Ошибка при линковке - C++
Доброго времени суток! Возникают ошибки на этапе линковки: Ошибка 1 error LNK2019: ссылка на неразрешенный внешний символ SHA256_Init...

Ошибка при линковке - C++
Здравствуйте. Помогите пожалуйста с проблемой над которой бьюсь уже не один день. Все компиляторы выдают след ошибки Error 3 error...

VS 6.0 ошибка при линковке - C++
Всё время с 6.0 при линковке выдаёт Linking... LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main Debug/Test.exe :...

Ошибка LNK2019 при линковке - как это решать систематически? - C++
Господа, я пишу на с++ в Visual Studio 2010 с использованием boost. ( &quot;В шахматы великий комбинатор играл второй раз в жизни&quot; ) ...

Не могу объявить массив указателей на объект - C++
Здравствуйте! Такой вопрос. При объявлении массива указателей на объект появляются 3 ошибки. void Cindex::merge(Ckey *A, int l, int m, int...

Объявить массив? Запросто! Объявить массив массивов? А как это? - C++
Доброго времени суток! Конечно, все знают, как объявить массив! int main () { int array; }

26
zer0mail
2374 / 2004 / 199
Регистрация: 03.07.2012
Сообщений: 7,197
Записей в блоге: 1
24.08.2013, 16:39 #2
Приведи пример неработащего кода и ОБЯЗАТЕЛЬНО заключи его в тег CPP для форматирования
0
-=ЮрА=-
Заблокирован
Автор FAQ
24.08.2013, 17:42 #3
Raybek, пишешь в Си а используеш конструкции плюсов
Цитата Сообщение от Raybek Посмотреть сообщение
for (int i=0; i<dlina; ++i)
, счётчик должен быть объявлен до начала цикла. На счёт всего остального да нет никакой ошибки, видимо компилятор у тебя кривой. Вот пример инициализации массива в теле main http://codepad.org/dIV68hMw
В массиве 'a' 18 элемент(а,ов)
Размер массива 'а' равен 72 Бт
Квадрат числа 0 равен 0
Квадрат числа 1 равен 1
Квадрат числа 2 равен 4
Квадрат числа 3 равен 9
Квадрат числа 4 равен 16
Квадрат числа 5 равен 25
Квадрат числа 6 равен 36
Квадрат числа 7 равен 49
Квадрат числа 8 равен 64
Квадрат числа 9 равен 81
Квадрат числа 10 равен 100
Квадрат числа 11 равен 121
Квадрат числа 12 равен 144
Квадрат числа 13 равен 169
Квадрат числа 14 равен 196
Квадрат числа 15 равен 225
Квадрат числа 16 равен 256
Квадрат числа 17 равен 289
Но вот если ты массивчик делал не статическим а динамическим, то конечно же так получить размер динамического массива
Цитата Сообщение от Raybek Посмотреть сообщение
long int razmer=sizeof(a);
long int dlina=razmer/sizeof(int);
невозможно
1
castaway
24.08.2013, 18:02
  #4

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
счётчик должен быть объявлен до начала цикла
Вообще-то стандарт С99 это позволяет.

0
-=ЮрА=-
Заблокирован
Автор FAQ
24.08.2013, 18:05 #5
castaway, речь шла о Си а не С++ читай внимательно
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
пишешь в Си а используеш конструкции плюсов
Добавлено через 32 секунды
Цитата Сообщение от Raybek Посмотреть сообщение
#include <stdio.h>

int main() {
- это Си (решил пояснить, вдруг не понятно откуда речь о Си пошла)
0
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
24.08.2013, 18:06 #6
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
castaway, речь шла о Си а не С++ читай внимательно
А я и говорю о стандарте Си 99.
http://ru.wikipedia.org/wiki/C99
Место, в котором возможно объявление переменных, больше не ограничено глобальной областью видимости и началом составного оператора (блока)
0
-=ЮрА=-
Заблокирован
Автор FAQ
24.08.2013, 18:09 #7
Цитата Сообщение от castaway Посмотреть сообщение
А я и говорю о стандарте Си 99.
неужели?
http://codepad.org/gN0ht0CN
Ещё раз на пальцах С99 целиком вошёл в С+11 но это не значит что С99 поддерживает С+11 Если твой компилятор позволяет значит у него поддержка С+11 и код он уже линкует как плюсовый
0
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
24.08.2013, 18:15 #8
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Так там об этом прямо и говориться:
In function 'main':
Line 14: error: 'for' loop initial declaration used outside C99 mode
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Если твой компилятор позволяет значит у него поддержка С+11 и код он уже линкует как плюсовый
Я компилятору указываю стандарт С89 - ругается.
error: 'for' loop initial declarations are only allowed in C99 mode
Указываю стандарт С99 - компилирует .

Тут русским языком написано что это было введено в С99.
1
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
24.08.2013, 18:54 #9
где то вычитал, что на старых компиляторах локальные инициализированные массивы должны быть статическими
C++
1
2
3
int main() {
 
   static int a[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17};
не знаю правда это или нет
0
-=ЮрА=-
Заблокирован
Автор FAQ
24.08.2013, 19:30 #10
castaway, выбрось вики или сожги, и ты и я знаем что о С99 ты лишь по вики прочёл
Во первых солидный онлайн компилятор так и написал
In function 'main':
Line 14: error: 'for' loop initial declaration used outside C99 mode
Далее продолжим в вики ничего нет более того чёрным по белому написано
GCC, невзирая на его расширенную поддержку C99, все ещё является не полностью совместимой реализацией: некоторые особенности не реализованы или работают некорректно.
Поэтому не стоит писать то что твой компилятор слинковал - это вне стандарта либо слинковалось всё под С+11
0
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
24.08.2013, 19:40 #11
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Во первых солидный онлайн компилятор так и написал
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Поэтому не стоит писать то что твой компилятор слинковал - это вне стандарта и нечего сливать тему
Ты наверное удивишься, но и мой и "солидный онлайн" компилятор - это GCC. Только мой версии 4.7.3, а "солидный" 4.1.2 ( http://codepad.org/about )
По-умолчанию, GCC использует стандарт gnu89 ( http://gcc.gnu.org/onlinedocs/gcc/C-...ialect-Options ), поэтому он и ругается.
Твоя первая ссылка ни о чем. Читаем во второй:
The first clause of a for loop can be (C99 §6.8.5.3) "a declaration" or a "void expression". Note that you can do:
C
1
2
int i = 0, *j = NULL;
for(int i = 0, *j = NULL;;){}
Потом заходим в стандарт ( http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf ) и читаем параграф §6.8.5.3
for ( clause-1; expression-2 ; expression-3 ) statement
...
If clause-1 is a declaration, the scope of any identifiers it declares is the remainder of the declaration and the entire loop, including the other two expressions;
...
Чего ты такой упертый то?
1
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
24.08.2013, 19:43 #12
Из C99:
Не могу объявить массив внутри main - ошибка при линковке
1
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
24.08.2013, 19:48 #13
Цитата Сообщение от Raybek Посмотреть сообщение
undefined reference to `__gxx_personality_v0'
Компилируете командой gcc или g++?
расширение файла .c или .cpp?
Если gcc + cpp, Тогда попробуйте так:
gcc -o main -x c main.cpp -std=c99
1
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
24.08.2013, 19:54 #14
Что за бред про "С99 целиком вошёл в С+11"?
Попробуй хотя бы restrict указатели использовать или VLA в C++11 прежде чем такое утверждать.
Код, приведенный ТС вполне успешно собирается как C99, так и C++. Но не C89.
0
Raybek
0 / 0 / 0
Регистрация: 24.08.2013
Сообщений: 7
24.08.2013, 21:22  [ТС] #15
Цитата Сообщение от zer0mail Посмотреть сообщение
Приведи пример неработащего кода и ОБЯЗАТЕЛЬНО заключи его в тег CPP для форматирования
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
int main() {
    int a[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17};
 
    long int razmer=sizeof(a);
    long int dlina=razmer/sizeof(int);
 
    printf("В массиве 'a' %lu элемент(а,ов) \n",dlina);
 
    printf("Размер массива 'а' равен %lu Бт \n", razmer);
 
    //Выводим содержимое массива "а"    
    for (int i=0; i<dlina; ++i)
    {
        printf("Квадрат числа %u равен %u \n",a[i],a[i]*a[i]);
    };
    
    return 0;
}
0
24.08.2013, 21:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2013, 21:22
Привет! Вот еще темы с ответами:

Ошибка при компиляции In function"int main()"; expected ';', before "cin", [Build Error] [main.o] Error 1 - C++
Книга &quot;Основы программирования на C++ том 1&quot;(Стэнли Б.Липпман). Приводится пример кода. #include &lt;iostream&gt; #include &lt;string&gt; using...

Ошибка multiple definition of main при наследовании - C++
Всем привет. Проблема описана много где в интернете , но я так и не смог понять в чём косяк у меня. Помогите разобраться. Есть...

как мне в функции main() объявить функцию Do (), подскажите пожалуйста, на таком глупом застрял - C++
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;conio.h&gt; #include &lt;clocale&gt; #include &lt;math.h&gt; using namespace std; class Tem; ...

Ошибка C4307 при объявлении в main() указателя шаблона-класса - C++
Привет, всем. Помогите, плиз, с синтаксисом. Возникает, ошибка при объявлении в main() указателя шаблона-класса. #include &lt;iostream&gt; ...


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

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

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