dlinyj: (Default)
[personal profile] dlinyj
Программисты делятся на два типа: тех кто не понимают указатели и тех кто уже понимает.
Есть функция, честно потыренная с stm32 (переношу код с стм-ки на ПК), которая считает модуль комплексных векторов.



И мне понадобилось, чтобы она возвращала вектор не в прямом, а обратном порядке. И совершенно очевидное решение.



Но есть нюанс © 💩 . В первом случае возвращает всё отлично, а во втором возвращает НУЛИ! Что я делаю не так? Я готов расписаться, что я хреновый программист и нифига не знаю си, но как?

З.Ы. Обратите внимания на прошлый пост, а главное на комментарии. Там коменты интереснее и содержательнее, чем пост. Прям как в лучшие годы ЖЖ.

З.З.Ы. Меня радует, что в коде можно вставлять комментарии в виде unicod-символов. Например, обозначить что код говно
//💩💩💩💩💩💩

Либо прям афигенный
//❤️❤️❤️❤️❤️❤️

Date: 2018-11-02 05:27 pm (UTC)
From: [identity profile] 5kopejek.livejournal.com
Я бы отключил оптимизацию для начала

Date: 2018-11-02 06:05 pm (UTC)
From: [identity profile] minimumlaw.livejournal.com
Размер pDst в два раза меньше, чем размер pSrc. Продолжать дальше?

Date: 2018-11-02 06:14 pm (UTC)
From: [identity profile] minimumlaw.livejournal.com
Сорри. Туплю. Вечер. Пятница :-)

Date: 2018-11-02 08:20 pm (UTC)
From: [identity profile] minimumlaw.livejournal.com
Да уж. В самый раз для вечера пятницы. И компа нет проверить на практике. Но если глаз и замылен, то у двоих точно. Должно работать. А не верить коллеге по цеху - дурной тон. Потому высказываю версию.

Итак, код протирается на ПК. А здешние компиляторы излишне умные. В чем разница верхнего и нижнего кода? Верхний будет работать корректно всегда. А нижний будет врать, если pSrc == pDst (т.е. если перекрываются области памяти параметров функции). Возможно, умный ПК'шный компилятор это понимает и пытается исправить. Судя по всему не очень успешно. Увы, борьба с шибко умным компилятором не редкость. Попробуйте прагму или ключи компилятора отключающие проверку перекрытия данных. Чем не шутит чёрт?

Ну, и практическая проверка будет как вернусь в город.

Date: 2018-11-02 10:35 pm (UTC)
From: [identity profile] electrodyssey.livejournal.com
я бы так попробовал

void arm_complex_mag_f32_rev (float * pSrc, float * pDst, uint32_t numSamples)
{
float realIn, imagIn, val;

pDst --;
while (numSamples > 0u)
{
realIn = *pSrc++;
imagIn = *pSrc++;

*(pDst + numSamples) = sqrt ((realIn * realIn) + (imagIn * imagIn));

numSamples --;
}
}

Date: 2018-11-02 11:22 pm (UTC)
From: [identity profile] electrodyssey.livejournal.com
Ещё поискал бы место где случайно могл бы модифицироваться адрес pDst

Date: 2018-11-07 12:07 am (UTC)
From: [identity profile] arush-damage.livejournal.com
Там еще херова куча опций про выравнивание и плавающую арифметику...
Но как оказалось продебажить и выяснить причину ошибки - не вариант, "Я просто отказался от этой функции :)." (С) %))))
Хотя учитывая что "функция, честно потыренная с stm32" там могло быть все что угодно, вплоть до "void f(void* pSrc, void*pDst, int numcounts)" и "(double *)(pDst[numSamples-1]) = sqrt()" %))))

Чудес не бывает, если при изменении инкремента на декремент - вместо данных нули, то это обычно проблема перекрытия данных из-за несовпадения типа, например "пишем word по адресу byte".
Edited Date: 2018-11-07 12:12 am (UTC)

Date: 2018-11-07 09:27 am (UTC)
From: [identity profile] dlinyj.livejournal.com
Да не, ну функция вот она. Ничего больше не добавлял. А дальше вызов уже из main.

Я отказался по другой причине, так как реверс массива был не нужен - это была бага в коде БПФ.

Но в целом-то, конечно, я буду дебажить в другой раз.

Date: 2018-11-03 11:25 am (UTC)
From: [identity profile] guman0id.livejournal.com
Ты же хорошо знаешь gdb, просто сделай single step на каждую инстукцию и будет понятно в какой момент что-то идёт не так.

Date: 2018-11-03 07:57 pm (UTC)
From: [identity profile] arush-damage.livejournal.com
double sqrt(double x);
float sqrtf(float x);
long double sqrtl(long double x);

Дальше продолжать? %)))

Date: 2018-11-03 07:58 pm (UTC)
From: [identity profile] arush-damage.livejournal.com
ЗЫ. И да - первый вариант портил память как раз за концом pDst.

Date: 2018-11-04 04:43 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
С чего вдруг? Ну если чё, так, для справки - это библиотечная функция.

Date: 2018-11-03 08:00 pm (UTC)
From: [identity profile] arush-damage.livejournal.com
ЗЫ. Неужели компилятор ворнингов не накидал?

Date: 2018-11-04 09:37 am (UTC)
From: [identity profile] guman0id.livejournal.com
Если справа от знака = стоит 64 битный тип, это не значит что в память запишется 64 вместо 32.

Date: 2018-11-04 12:48 pm (UTC)
From: [identity profile] 5kopejek.livejournal.com
И что?
По правилам тип стоящий справа от присваивания будет неявно преобразован к типу стоящему слева.

Date: 2018-11-04 04:43 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
Херню сморозил, ниже уже сказали

Date: 2018-11-06 03:18 pm (UTC)
From: [identity profile] ioserg.livejournal.com
Привет! Ну и чем закончилось?

Date: 2018-11-06 04:00 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
Я просто отказался от этой функции :).

Date: 2018-11-06 04:33 pm (UTC)
From: [identity profile] ioserg.livejournal.com
void result(float *,float *, long);
int main(int argc, char **argv)
{
printf("%s","result : ");

float sem[]={1,2,3,4};
float res[4];
result(sem,res,4);

for(int i=0;i<4;i++){
printf(" [%f] ",res[i]);
}

return 0;
}
void result(float *src, float *dest,long samples){
float in;
while(samples>0u){
in=*src++;
dest[samples-1]=in;
samples--;
}
}
Я не знаю языков, но вот этот код полностью работает. gcc -Wall -o ,с опцией -o1 geany что то не собирает.
'
Edited Date: 2018-11-06 04:34 pm (UTC)

Date: 2018-11-06 05:57 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
Да, спасибо. Вероятнее всего у меня ошибка была где-то в другом. Поэтому были нули.

January 2026

S M T W T F S
    123
456 78910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 22nd, 2026 10:30 pm
Powered by Dreamwidth Studios