2013-10-12 4 views
0

Так что я пытался выполнить это задание в течение нескольких часов, и я не могу понять это, я на 99% уверен, что это связано с тем, как я использовал указатели. И ошибка, которую я получаю, - это разрыв 0xC0000005: местоположение записи нарушения доступа 0xCCCCCCCC.which, я думаю, что некоторые из моих указателей равны нулю. Извините за любительские коды заранее ..Я не думаю, что правильно использую указатели. C

#include<stdio.h> 

void load(int *salary) 
{ 
    printf("Please enter your salary: "); 
    scanf("%d", *salary); 
} 

void calc(int *salary, float *rate, int *raise, int *newsalary) 
{ 
    rateofsalary(&salary); 
    *raise = *salary/(*rate); 
    *newsalary = *raise+*salary; 
} 
float rateofsalary(int *salary) 
{ 
    float rate; 
    if(*salary<0 && *salary>=30000) 
     rate = 7.0; 
    else 
     if(*salary<30000 && *salary>=40000) 
      rate = 5.5; 
     else 
      if(*salary<40000) 
       rate = 4.0; 
    return rate; 
} 

void print(int *salary, float *rate, int *raise, int *newsalary) 
{ 
    printf("|  | Salary | Rate % | Raise | New Salary |\n"); 
    printf("|  | %d  | %0.2f | %d | %d   |\n", salary, rate, raise, newsalary); 
} 

void main() 
{ 
    int salary, raise, newsalary; 
    float rate; 
    load(&salary); 
    rateofsalary(&salary); 
    calc(&salary, &rate, &raise, &newsalary); 
    print(&salary, &rate, &raise, &newsalary); 
} 
+0

'rateofsalary (& зарплата);' зарплата уже 'ИНТ *', нет необходимости, чтобы получить свою ссылку –

+0

'rateofsalary (& зарплаты);' должен быть 'ставка = rateofsalary (& зарплата);' –

ответ

1
scanf("%d", *salary); 

изменить его

scanf("%d", salary); 

и функция printf должна быть

printf("|  | %d  | %0.2f | %d | %d   |\n", *salary, *rate, *raise, *newsalary); 
+0

Есть и другие подобные ошибки , хоть –

1

для функции нагрузки она должна быть

void load(int *salary) 
{ 
    printf("Please enter your salary: "); 
    scanf("%d", salary); 
} 
0

хорошо в этой строке scanf("%d", *salary); вместо *salary просто поставить salary так заменить его с этим scanf("%d", salary);

0

В общем, ваша проблема в том, что вы не знаете, когда уйти :)

Если что-то типа int *, это означает, что это указатель на int, и не обязательно и не нужно поворачиваться и использовать на нем &, что превращает его в указатель на указатель на int. Вы делаете эту ошибку несколько раз, причем не только в первой короткой функции, как указывали другие ответы, но в нескольких местах. Вам удастся превратить переменную salary из main в указатель на указатель на int на время, когда вы проходите, добавляя уровень косвенности каждый раз, когда вы вызываете другую функцию.

Просто следите за тем, что хочет каждая функция. Если функция принимает int* в качестве аргумента и вызывает другую функцию, которая хочет int*, тогда она может просто передать переменную вдоль как есть: вам не нужно добавлять & к ней.

0

Есть несколько мест, в которых вы неправильно используете указатели. То, что другие еще не упомянуть: в функции:

void calc(int *salary, float *rate, int *raise, int *newsalary) 
{ 
    rateofsalary(&salary); 
    *raise = *salary/(*rate); 
    *newsalary = *raise+*salary; 
} 

вы звоните rateofsalary с &salary, который pointer to pointer to int (интермедиат **), но формальный аргумент rateofsalary объявлен как int *, который pointer to int.

Это не лучшая идея для переменной по ссылке на функцию, которая не должна позволять изменять эту переменную. Передайте его по значению или объявите функциональный параметр как const.
Идея передачи по ссылке заключается в том, чтобы иметь возможность изменять переменную, переданную функции внутри тела функции, и вам, кажется, не хватает указателей на самом деле или их практическое использование.

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