2013-10-03 2 views
1

У меня возникли проблемы с работой с массивами поплавков. Я бросаю несколько массивов поплавков в ActivationFunc, а затем оттуда бросаю те же массивы в sgnFunction, которые почему-то заканчиваются тем, что имеют разные значения.C, ошибка компилятора и указатели

#include <stdio.h> 
void sgnFunction(float *input[], float *weight[]) 
{ 
    printf("VALUES: %.2f %.2f %2.f, WEIGHTS: %.2f, %.2f, %.2f\n", *input[0], *input[1], *input[2], *weight[0], *weight[1], *weight[2]); 
} 

void ActivationFunc(float *x, float *w, float *n, int *d) 
{ 
    printf("VALUES: %.2f %.2f %2.f, WEIGHTS: %.2f, %.2f, %.2f\n", x[0], x[1], x[2], w[0], w[1], w[2]); 
    sgnFunction(&x, &w); 
} 

int main() 
{ 
    float x1[3] = {1, 0, 1}; 
    float x2[3] = {0, -1, -1}; 
    float x3[3] = {-1, -0.5, -1}; 
    int d[3] = {0, 1, 1}; 
    float w[3] = {1, -1, 0}; 
    float n = 0.1; 

    ActivationFunc(x1, w, &n, &d[0]); 
} 

Если я удалить '&' от "sgnFunction (& х, & W)," я получаю ошибку компилятора:

test.c: In function 'ActivationFunc': 
test.c:10:9: warning: passing argument 1 of 'sgnFunction' from incompatible pointer type 
test.c:2:14: note: expected 'float **' but argument is of type 'float *' 

Что я не понимаю, что это значит Исправить это. Я знаю, что я, вероятно, просто прикручиваю что-то с помощью указателей. Хорошее объяснение того, что не так, что я делаю неправильно с моими указателями, и как исправить это, будем очень благодарны.

ответ

2

если вы звоните функции как этот

sgnFunction(x, w); 

Ваше определение должно быть

void sgnFunction(float *input, float *weight) // you just need to change array of pointers to single pointer 
{ 
    printf("VALUES: %.2f %.2f %2.f, WEIGHTS: %.2f, %.2f, %.2f\n", input[0], input[1], input[2], weight[0], weight[1], weight[2]); // here also 
} 
+0

Ahhh ... У меня было неправильное представление о том, что мне пришлось передать его в синтаксисе C# или Java. Указатели - это просто указатели - я должен помнить об этом. Спасибо! – Shaku

+0

Добро пожаловать. – Gangadhar

0
sgnFunction(&x, &w); 

Проблема заключается в том, что вы передаете адрес указателя, который имеет тип float **. Вобще -

sgnFunction(x, w); 

x имеет тип float *. Таким образом, при выполнении &x будет указан адрес указателя, который имеет тип float **.

Кроме того, передача массива будет распадаться на указатель на первый элемент массива. Таким образом, изменение подписи функции -

void sgnFunction(float *input, float *weight); 
+0

Я сформулировал ниже свой код: «Если я удалю« & »из« sgnFunction (& x, &w); », я получаю ошибку компилятора: ...» – Shaku

+0

'float *, float **, float * [ N] 'все разные типы. – Mahesh

0

недействительным sgnFunction (поплавок * входной [], всплывают * вес [])

Вы хотите иметь в виду: void sgnFunction (float * input, flo при * вес)

поплавка * а [] эффективно поплавок **

0

Ключ, в с, оператор индекса массива имеет более высокий приоритет, чем де-эталонный оператор. Следовательно, выражение * input [0] будет оцениваться как * (вход [0]).

рассмотреть заявление,

int a[3][4] = { {1, 2 ,3}, {4, 5, 6} };

Здесь 'а' является 2-D массив A, "& а [0] [0] проецирует адрес первого элемента,«а [0 ] 'проектирует адрес первой строки, а' a 'проектирует базовый адрес массива. Если вы печатаете адрес во всех трех случаях, упомянутых выше, вы получите одинаковое значение, но характер адреса отличается. В случае 1 адрес относится к элементу, в случае 2 адрес относится к строке элементов. В случае 3 адрес относится ко всему массиву.

В функции, sgnFunction,

при оценке, * вход [0], оно оценивается как * (вход [0]) это относится к первой строке «вход», который является «х», так что ваши значение как ожидалось.Но при оценке вход [1] ( (вход [1])) это относится ко второй строке «ввода». Но второй строки нет. Отсюда и стоимость мусора. Чтобы исправить это, измените * вход [1] на (* вход) [1].

На боковой ноте, при вызове функции sgnFunction, должно быть достаточно использовать call-by-value вместо call-by-reference.

Смежные вопросы