Найдено результатов: 5

Как исправить ошибку "for loop initial declaration used outside C99 mode" GCC?

Я пытаюсь решить проблему 3n+1 , и у меня есть цикл for , который выглядит следующим образом:

for(int i = low; i <= high; ++i)
        {
                res = runalg(i);
                if (res > highestres)
                {
                        highestres = res;
                }

        }

К сожалению, я получаю эту ошибку, когда пытаюсь скомпилировать с GCC:

3np1.c:15: ошибка: 'for' начальный цикл объявление, используемое вне режима C99

Я не знаю, что такое режим C99. Есть какие-нибудь идеи?

c   gcc   for-loop    

998   10   12:16, 16th August, 2020


Нарушается ли GCC при приеме адреса аргумента на ARM7TDMI?

Фрагмент кода My C принимает адрес аргумента и сохраняет его в энергонезависимой памяти (предварительно обработанный код):

void foo(unsigned int x) {
    *(volatile unsigned int*)(0x4000000 + 0xd4) = (unsigned int)(&x);
}

int main() {
    foo(1);
    while(1);
}

Я использовал SVN версию GCC для компиляции этого кода. В конце функции foo я ожидал бы, что значение 1 будет сохранено в стеке, а в 0x40000d4-адрес , указывающий на это значение. Когда я компилирую без оптимизации, используя флаг -O0, я получаю ожидаемый выход ARM7TMDI assembly (прокомментированный для вашего удобства):

        .align  2
        .global foo
        .type   foo, %function
foo:
        @ Function supports interworking.
        @ args = 0, pretend = 0, frame = 8
        @ frame_needed = 0, uses_anonymous_args = 0
        @ link register save eliminated.
        sub     sp, sp, #8
        str     r0, [sp, #4]     @ 3. Store the argument on the stack
        mov     r3, #67108864
        add     r3, r3, #212
        add     r2, sp, #4       @ 4. Address of the stack variable
        str     r2, [r3, #0]     @ 5. Store the address at 0x40000d4
        add     sp, sp, #8
        bx      lr
        .size   foo, .-foo
        .align  2
        .global main
        .type   main, %function
main:
        @ Function supports interworking.
        @ args = 0, pretend = 0, frame = 0
        @ frame_needed = 0, uses_anonymous_args = 0
        stmfd   sp!, {r4, lr}
        mov     r0, #1           @ 1. Pass the argument in register 0
        bl      foo              @ 2. Call function foo
.L4:
        b       .L4
        .size   main, .-main
        .ident  "GCC: (GNU) 4.4.0 20080820 (experimental)"

Он четко сохраняет аргумент сначала в стеке, а оттуда сохраняет его в 0x40000d4 . Когда я компилирую с оптимизациями, используя -O1 , я получаю что-то неожиданное:

        .align  2
        .global foo
        .type   foo, %function
foo:
        @ Function supports interworking.
        @ args = 0, pretend = 0, frame = 8
        @ frame_needed = 0, uses_anonymous_args = 0
        @ link register save eliminated.
        sub     sp, sp, #8
        mov     r2, #67108864
        add     r3, sp, #4        @ 3. Address of *something* on the stack
        str     r3, [r2, #212]    @ 4. Store the address at 0x40000d4
        add     sp, sp, #8
        bx      lr
        .size   foo, .-foo
        .align  2
        .global main
        .type   main, %function
main:
        @ Function supports interworking.
        @ args = 0, pretend = 0, frame = 0
        @ frame_needed = 0, uses_anonymous_args = 0
        stmfd   sp!, {r4, lr}
        mov     r0, #1           @ 1. Pass the argument in register 0
        bl      foo              @ 2. Call function foo
.L4:
        b       .L4
        .size   main, .-main
        .ident  "GCC: (GNU) 4.4.0 20080820 (experimental)"

На этот раз аргумент никогда не сохраняется в стеке, даже если что- то из стека все еще хранится в 0x40000d4 .

Это просто ожидаемое / неопределенное поведение? Я сделал что-то не так или действительно нашел компилятор Bug™?

c   gcc   arm   assembly    

483   11   08:29, 23rd August, 2020


CMake и статическая линковка

Есть небольшая самописная кроссплатформенная игрушка использующая SDL. Язык C++. Под Win32 и Win64 собирается в mingw-w64, gcc 4.5.1.

Хочется следующего: в сборках под Windows линковать зависимости статически. Не охота таскать за собой добрый десяток библиотек. Сейчас в среде сборки есть оба варианта библиотек: для статической и динамической линковки. По умолчанию gcc предпочитает линковать динамически. Для того, чтобы он выбирал статические версии библиотек требуется добавлять перед ними ключ -static. Причём потом требуется перед библиотеками, которые линкуются динамически (OpenGL), добавить ключ -dynamic.

Вопрос: как заставить/научить cmake собирать нужную командную строку?

C++   MinGW   CMake   GCC    

441   2   10:16, 14th August, 2020


Возможно ли сделать объектно-ориентированное API через DLL (GCC, C++)?

Добрый день.
Вопрос следующий — пусть есть абстрактное приложение, к которому хочется добавить некоторое API для плагинов. Плагины скорее всего будут представлять собой DLL'ки, которые динамически подгружаются основным кодом.
В Java можно сделать интерфейс IPlugin, а в плагине расширить его: public class MySuperPlugin implements IPlugin, после чего спокойно подгружать тысячи классов по именам. Можно ли сделать что-то похожее в C++? Я знаю, что можно спокойно подгружать обычные функции (не члены класса) из DLL. Пока придумались только такие костыли: делаем много функций «переходников», каждая из которых вызывает соответствующий член класс. Но это ужас.
Как решить? Ведь, наверное, можно.

API   ООП   C++   GCC   DLL    

315   2   13:48, 1st August, 2020


Qt4 не видит функцию в динамической библиотеке, хотя саму библиотеку подключает?

Собрал динамическую библиотеку libbozorth3. В ней определена функция bozorth_main(xyt_struct*, xyt_struct*)

Проверил на тестовом исходнике, собрал с помощью gcc, все скомпилилось, функция отработала нормально.


Но вот когда я подключаю эту же библиотеку к Qt4 (в Qt Creator'е), то gcc ее видит (иначе бы ругался, что библиотека не найдена), но не видит эту функцию (хотя я просто скопировал код из тестового исходника в мой проект). В чем может быть проблема и как исправить? Почему один и тот же gcc в первом случае собирает нормально, а вот вместе с qt4 не находит функцию?

robotex@robotex-laptop ~/workspace/qt_fprint-build-desktop $ gcc -o qt_fprint main.o
mainwindow.o cfingerprintscanner.o cfingerprintdata.o moc_mainwindow.o moc_cfingerprintscanner.o
-lfprint -lQtGui -lQtCore -lpthread -lbozorth3cfingerprintscanner.o:
In function `CFingerprintScanner::comparePrintData(CFingerprintData,
CFingerprintData)':
/home/robotex/workspace/qt_fprint-build-desktop/../qt_fprint/cfingerprintscanner.cpp:475: undefined
reference to `bozorth_main(xyt_struct*, xyt_struct*)'
collect2: ld returned 1 exit status

Qt   GCC    

378   1   16:05, 1st October, 2020