Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Raybek
0 / 0 / 0
Регистрация: 24.08.2013
Сообщений: 7
24.08.2013, 16:28     Не могу объявить массив внутри main - ошибка при линковке #1
Доброго времени суток!

Я начинающий в С++. Использую 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zer0mail
2177 / 1860 / 187
Регистрация: 03.07.2012
Сообщений: 6,618
Записей в блоге: 1
24.08.2013, 16:39     Не могу объявить массив внутри main - ошибка при линковке #2
Приведи пример неработащего кода и ОБЯЗАТЕЛЬНО заключи его в тег CPP для форматирования
-=ЮрА=-
Заблокирован
Автор FAQ
24.08.2013, 17:42     Не могу объявить массив внутри main - ошибка при линковке #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);
невозможно
castaway
24.08.2013, 18:02
  #4

Не по теме:

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

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

int main() {
- это Си (решил пояснить, вдруг не понятно откуда речь о Си пошла)
castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
24.08.2013, 18:06     Не могу объявить массив внутри main - ошибка при линковке #6
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
castaway, речь шла о Си а не С++ читай внимательно
А я и говорю о стандарте Си 99.
http://ru.wikipedia.org/wiki/C99
Место, в котором возможно объявление переменных, больше не ограничено глобальной областью видимости и началом составного оператора (блока)
-=ЮрА=-
Заблокирован
Автор FAQ
24.08.2013, 18:09     Не могу объявить массив внутри main - ошибка при линковке #7
Цитата Сообщение от castaway Посмотреть сообщение
А я и говорю о стандарте Си 99.
неужели?
http://codepad.org/gN0ht0CN
Ещё раз на пальцах С99 целиком вошёл в С+11 но это не значит что С99 поддерживает С+11 Если твой компилятор позволяет значит у него поддержка С+11 и код он уже линкует как плюсовый
castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
24.08.2013, 18:15     Не могу объявить массив внутри main - ошибка при линковке #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.
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
24.08.2013, 18:54     Не могу объявить массив внутри main - ошибка при линковке #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};
не знаю правда это или нет
-=ЮрА=-
Заблокирован
Автор FAQ
24.08.2013, 19:30     Не могу объявить массив внутри main - ошибка при линковке #10
castaway, выбрось вики или сожги, и ты и я знаем что о С99 ты лишь по вики прочёл
Во первых солидный онлайн компилятор так и написал
In function 'main':
Line 14: error: 'for' loop initial declaration used outside C99 mode
Далее продолжим в вики ничего нет более того чёрным по белому написано
GCC, невзирая на его расширенную поддержку C99, все ещё является не полностью совместимой реализацией: некоторые особенности не реализованы или работают некорректно.
Поэтому не стоит писать то что твой компилятор слинковал - это вне стандарта либо слинковалось всё под С+11
castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
24.08.2013, 19:40     Не могу объявить массив внутри main - ошибка при линковке #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/WG...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;
...
Чего ты такой упертый то?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
24.08.2013, 19:43     Не могу объявить массив внутри main - ошибка при линковке #12
Из C99:
Не могу объявить массив внутри main - ошибка при линковке
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
24.08.2013, 19:48     Не могу объявить массив внутри main - ошибка при линковке #13
Цитата Сообщение от Raybek Посмотреть сообщение
undefined reference to `__gxx_personality_v0'
Компилируете командой gcc или g++?
расширение файла .c или .cpp?
Если gcc + cpp, Тогда попробуйте так:
gcc -o main -x c main.cpp -std=c99
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
24.08.2013, 19:54     Не могу объявить массив внутри main - ошибка при линковке #14
Что за бред про "С99 целиком вошёл в С+11"?
Попробуй хотя бы restrict указатели использовать или VLA в C++11 прежде чем такое утверждать.
Код, приведенный ТС вполне успешно собирается как C99, так и C++. Но не C89.
Raybek
0 / 0 / 0
Регистрация: 24.08.2013
Сообщений: 7
24.08.2013, 21:22  [ТС]     Не могу объявить массив внутри main - ошибка при линковке #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;
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
24.08.2013, 21:24     Не могу объявить массив внутри main - ошибка при линковке #16
Raybek,
Цитата Сообщение от Croessmah Посмотреть сообщение
Компилируете командой gcc или g++?
Raybek
0 / 0 / 0
Регистрация: 24.08.2013
Сообщений: 7
24.08.2013, 21:24  [ТС]     Не могу объявить массив внутри main - ошибка при линковке #17
Компилирую код в командной строке терминала следующим образом:

gcc array1.cpp -o array1
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
24.08.2013, 21:29     Не могу объявить массив внутри main - ошибка при линковке #18
Цитата Сообщение от Raybek Посмотреть сообщение
gcc array1.cpp -o array1
Код
g++ array1.cpp -o array1
Raybek
0 / 0 / 0
Регистрация: 24.08.2013
Сообщений: 7
24.08.2013, 21:30  [ТС]     Не могу объявить массив внутри main - ошибка при линковке #19
Цитата Сообщение от Croessmah Посмотреть сообщение
Компилируете командой gcc или g++?
расширение файла .c или .cpp?
Если gcc + cpp, Тогда попробуйте так:
gcc -o main -x c main.cpp -std=c99
Спасибо! Так скомпилировал!

Профессионалы, как новичок, из Ваших рассуждений выше вынес, что дело все-таки в используемом компилятором стандарте? с89, с99? А как узнать какой по умолчанию стандарт использует компилятор gcc?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2013, 21:30     Не могу объявить массив внутри main - ошибка при линковке
Еще ссылки по теме:

C++ Объявить массив? Запросто! Объявить массив массивов? А как это?
C++ Ошибка при компиляции In function"int main()"; expected ';', before "cin", [Build Error] [main.o] Error 1
Ошибка C4307 при объявлении в main() указателя шаблона-класса C++

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

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
24.08.2013, 21:30     Не могу объявить массив внутри main - ошибка при линковке #20
либо
Код
gcc array1.cpp -o array1 -std=c99
Yandex
Объявления
24.08.2013, 21:30     Не могу объявить массив внутри main - ошибка при линковке
Ответ Создать тему
Опции темы

Текущее время: 06:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru