Значение для присвоения к 'paramName' параметру для ArgumentException в методе set свойства C#?

У вас ошибка сегментации, потому что вы пишете по неинициализированному адресу в void fft(complex_num* input, complex_num* output, int n) в строке:

output[i] = inp[i];

вывод происходит из fft2 в строка

fft(input[i], temp[i], width);

, где temp установлена ​​

temp = (complex_num **) malloc(width * sizeof(complex_num*));

, но temp[i] не инициализирована

Возможно, fft(input[i], temp[i], width); должно быть fft(input[i], &temp[i], width); в то время как fft становятся:

void fft(complex_num* input, complex_num** output, int n) {

  complex_num* dummy = (complex_num *)malloc(n * sizeof(complex_num));
  complex_num* inp = (complex_num *)malloc(n * sizeof(complex_num));

  for (int i = 0; i < n; ++i) {
    dummy[i].real = 0;
    dummy[i].imag = 0;
    inp[i].real = 0;
    inp[i].imag = 0;
  }

  printf("%lf", inp[1].real);
  for (int i = 0; i < n; ++i) {
    dummy[i] = input[i];
    inp[i] = input[i];
  }

  fft_driver(inp, dummy, n, 1);

  printf("Hello\n");

  *output = inp;
}

В любом случае в fft2 есть другая проблема в вызове:

fft(matrix[i], &temp[i], width);

, потому что инициализация matrix[i] прокомментирована, matrix[i] не инициализирована и в fft вы получаете доступ к неизвестным адресам в этих строках

dummy[i] = input[i];
inp[i] = input[i];

Строка //matrix[i] = (complex_num*) malloc(height * sizeof(complex_num)); не должна быть в комментарий, но также изменяющий размер выделения:

matrix[i] = (complex_num*) malloc(width * sizeof(complex_num));

и ниже строки matrix[i][j] = temp[j][i]; не должен быть в комментарии

, делая все изменения, которые выполняются (я использовал 3.1415927 для M_PI)

/tmp % ./a.out
0.000000Hello
0.000000Hello
0.000000Hello
0.000000Hello
4.0000004.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.000000Hello
0.000000Hello
0.000000Hello
0.000000Hello
[(8, 0), (0, 0), (0, 0), (0, 0), ]
[(4, -4), (0, 0), (0, 0), (0, 0), ]
[(0, 0), (0, 0), (0, 0), (0, 0), ]
[(4, 4), (0, 0), (0, 0), (0, 0), ]
0.000000Hello
0.000000Hello
0.000000Hello
0.000000Hello
8.0000004.0000000.0000004.0000008.0000004.0000000.0000004.0000008.0000004.0000000.0000004.0000008.0000004.0000000.0000004.0000000.000000Hello
0.000000Hello
0.000000Hello
0.000000Hello
[(1, -0), (1, -0), (1, -0), (1, -0), ]
[(1, -2.8606e-18), (1, -2.8606e-18), (1, -2.8606e-18), (1, -2.8606e-18), ]
[(0, 0), (0, -0), (0, -0), (0, -0), ]
[(0, 2.8606e-18), (0, 2.8606e-18), (0, 2.8606e-18), (0, 2.8606e-18), ]

Я не знаю, является ли это ожидаемым результатом, но по крайней мере valgrind не обнаруживает никаких незаконных м доступ к памяти и неинициализированные значения.

У вас есть утечки памяти, чтобы их устранить:

в fft2 заменить

for (int i = 0; i < height; ++i) {
  fft(matrix[i], &temp[i], width);
}

на

for (int i = 0; i < height; ++i) {
  free(temp[i]);
  fft(matrix[i], &temp[i], width);
  free(matrix[i]);
}

free(matrix);

и в конце add

for (int i = 0; i < height; ++i)
  free(temp[i]);
free(temp);

В fft добавить free(dummy); до конца

Эти изменения устраняют все утечки памяти:

/tmp % valgrind --leak-check=full ./a.out
==12924== Memcheck, a memory error detector
==12924== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==12924== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==12924== Command: ./a.out
==12924== 
0.000000Hello
0.000000Hello
0.000000Hello
0.000000Hello
4.0000004.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.000000Hello
0.000000Hello
0.000000Hello
0.000000Hello
[(8, 0), (0, 0), (0, 0), (0, 0), ]
[(4, -4), (0, 0), (0, 0), (0, 0), ]
[(0, 0), (0, 0), (0, 0), (0, 0), ]
[(4, 4), (0, 0), (0, 0), (0, 0), ]
0.000000Hello
0.000000Hello
0.000000Hello
0.000000Hello
8.0000004.0000000.0000004.0000008.0000004.0000000.0000004.0000008.0000004.0000000.0000004.0000008.0000004.0000000.0000004.0000000.000000Hello
0.000000Hello
0.000000Hello
0.000000Hello
[(1, -0), (1, -0), (1, -0), (1, -0), ]
[(1, -2.8606e-18), (1, -2.8606e-18), (1, -2.8606e-18), (1, -2.8606e-18), ]
[(0, 0), (0, -0), (0, -0), (0, -0), ]
[(0, 2.8606e-18), (0, 2.8606e-18), (0, 2.8606e-18), (0, 2.8606e-18), ]
==12924== 
==12924== HEAP SUMMARY:
==12924==     in use at exit: 0 bytes in 0 blocks
==12924==   total heap usage: 44 allocs, 44 frees, 2,688 bytes allocated
==12924== 
==12924== All heap blocks were freed -- no leaks are possible
==12924== 
==12924== For counts of detected and suppressed errors, rerun with: -v
==12924== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 6)

[1151 ] Обратите также внимание, что main должно быть int main(), а не void main()


Если я добавлю весь код, чтобы помочь вам, потому что есть много изменений:

[ 1112]
11
задан DavidRR 2 February 2018 в 13:32
поделиться

3 ответа

ArgumentExceptions содержат название параметра, который не допустим. Для метода set свойства фактический параметр называют значением (и в источнике и в сгенерированном коде). Это более последовательно для использования этого имени.

9
ответ дан 3 December 2019 в 06:22
поделиться

Да, это было бы более ясно передать название свойства.

2
ответ дан 3 December 2019 в 06:22
поделиться

После обширного ввода по абсолютному адресу вокруг с Отражателем (пытающийся найти CLR возражают с перезаписываемым Свойством), первый я нашел (FileStream. Положение) использующий "значение" в качестве имени аргумента:

if (value < 0L)
{
    throw new ArgumentOutOfRangeException("value", 
                 Environment.GetResourceString("NeedNonNegNum"));
}
8
ответ дан 3 December 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: