2015-02-04 6 views
0

Я хочу использовать два указателя для определения содержимого массива. Вот почему у меня есть:C: использование указателя-содержимого в качестве параметра массива

int *Q1, *Q2; 

позже (в функции), это должно произойти:

*Q1 = 11, *Q2 = 2;  
field[*Q1][*Q2]='?'; 

это важно, что Q1 и 2 объявляются в функции. Поэтому они всегда могут использоваться в основном как Q1 и Q2, но могут быть изменены различными функциями =/ Можете ли вы мне помочь? На данный момент компилятор сообщает мне, что индекс массива не является целым числом. Как мне его записать?

С уважением!

Вот полный код:

#include <stdio.h> 
#include <conio.h> 
#include <stdlib.h> 
#define HEIGHT 15      
#define WIDTH 15       


int field[HEIGHT][WIDTH]; 

int *Q1, *Q2; 


void forest1() { 
    int *Q1 = 11, *Q2 = 2; 
    field[2][3]=field[1][11]=field[9][10]=field[5][0]=field[5][14]=field[8][0]=field[8][14]='-'; 
    field[3][2]=field[2][10]=field[10][9]='('; 
    field[3][4]=field[2][12]=field[10][11]=')'; 
    field[4][3]=field[5][3]=field[3][11]=field[4][11]=field[11][10]=field[12][10]='H'; 
    field[0][5]=field[0][8]=field[14][5]=field[14][8]='|'; 
    field[*Q1][*Q2]='?'; 
} 

void printField(){ 
    int i; 
    int i2; 
    for (i = 0; i<HEIGHT; i++){ 
     for (i2=0; i2<WIDTH; i2++) 
      printf("%3c", field[i][i2]);  
     printf("\n\n"); 
    } 
} 

void initField(){ 
    int i; 
    for (i = 1; i<sizeof(field); i++)  
     field[i%WIDTH][i/WIDTH]=' ';   
} 

int main() { 
    char direction; 
    int h = 7; int w = 7;     // Starting Point 


    initField(); 
    field[h][w]='o'; 
    forest1(); 
    printField(); 
    printf("Welcome! Move with wasd - have fun testing! \n\n"); 

int obstacle(char direction) { 


    switch(direction) { 
     case 'w': { 
      if (field[h-1][w]== '(' || field[h-1][w]== '-' || field[h-1][w]== ')' || field[h-1][w]== 'H' || h-1 < 0) 
      return 1; 
      else return 0; 
      break; 
     } 
     case 'a': { 
      if (field[h][w-1]== '(' || field[h][w-1]== '-' || field[h][w-1]== ')' || field[h][w-1]== 'H' || w-1 < 0) 
      return 1; 
      else return 0; 
      break; 
     } 
     case 's': { 
      if (field[h+1][w]== '(' || field[h+1][w]== '-' || field[h+1][w]== ')' || field[h+1][w]== 'H' || h+1 > 14) 
      return 1; 
      else return 0; 
      break; 
     } 
     case 'd': { 
      if (field[h][w+1]== '(' || field[h][w+1]== '-' || field[h][w+1]== ')' || field[h][w+1]== 'H' || w+1 > 14) 
      return 1; 
      else return 0; 
      break; 
     } 
     default: return 0; break; 
    } 

} 


void move() { 

    while (1) { 

     direction = getch(); 

     if (obstacle(direction)!=1){ 

        if (field[*Q1][*Q2]=='o') { 
         /* German content since this will be a german little game. Basically says it's a question block*/ 
    printf("Hallo! Dies ist ein Infoblock! Er gibt dir wertvolle Informationen.\n"); 
    system("pause"); 
} 


      if (direction=='w') { 
        field[h][w]=' '; 
        h = h-1; 
        field[h][w]='o'; 
       } 

      if (direction=='a'){ 
        field[h][w]=' '; 
        w = w-1; 
        field[h][w]='o'; 
       } 

      if (direction=='s'){ 
        field[h][w]=' '; 
        h = h+1; 
        field[h][w]='o'; 
       } 

      if (direction=='d'){ 
        field[h][w]=' '; 
        w = w+1; 
        field[h][w]='o'; 
       } 
      system("cls"); 
      printField(); 
     } 
    } 
} 



    move(); 

    } 

Компилятор говорит мне для этого точного кода: «Line 16: [Внимание] инициализация делает указатель из целого числа без приведения [по умолчанию включено]» дважды, для col 12 и col 22. Когда я запускаю программу Это сбой, но ничего не печатает

+1

Покажите нам фактический код, который неисправен, и точное сообщение об ошибке. Прочитайте это сначала: http://sscce.org/. И C не имеет параметров массива. –

+0

Mhhh, ладно.Это должно быть маленькая игра, в которой вы перемещаете маленький аватар («o»). Поскольку я хочу изменить карты, мне нужно изменить расположение блоков вопросов =/Тем не менее, я хочу, чтобы движение останавливалось, когда аватар касается «?» , Код будет раздельным, так как в комментарии недостаточно символов – HannahAround

+0

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

ответ

3

Вы не можете инициализировать int *Q1 = 11.

int *Q1 - это указатель на целочисленную переменную, поэтому он может хранить только указатель, который указывает на переменную, которая может хранить целое число.

вы можете инициализировать/назначить переменную Q1 только указателем. & используется для получения адреса переменных в С.

пример:

int a = 12; 
int *Q1 = &a; 

Вот почему вы получаете предупреждение компилятора о том, «Line 16: [Внимание] инициализация делает указатель из целого числа без гипса [включено по умолчанию] "

12 - целое число, и вы попытались назначить его указателю на целочисленную переменную, и когда компилятор попытался выполнить неявное преобразование типа, он дал предупреждение.

if (field[h][w-1]== '(' || field[h][w-1]== '-' || field[h][w-1]== ')' || field[h][w-1]== 'H' || w-1 < 0) 
     return 1; 
    else return 0; 
    break; 

Эта часть коды в вашей программе, называется мертвым кодом, где контроль никогда не может достичь, например, break заявления. старайтесь избегать их.

Локальные переменные являются локальными для функции и не доступны для других функций в вашей программе.

Кроме того, у вас есть переменные h, w, которые являются локальными по умолчанию, но вы использовали всю вашу программу, если хотите использовать любую переменную вне функции, сделать их глобальными. если вы хотите, чтобы они были изменены с помощью функции вызова, используйте pass by reference.

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

+0

Большое спасибо ^.^Я все еще участвую, и я сожалею о вещах, которые кажутся очевидными ^^ ' – HannahAround

+0

Нет проблемы @ Ханна. Все делают ошибки и трюки, стараются не делать этого снова. – Sridhar

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