2017-10-12 53 views
-2

我正在尝试做一些指针算术,并且由于某种原因,指针在退出循环后并未保留地址中的更改。指针算术不起作用

我的输出是反复打印不变的数组指针地址(整数数组)。

它应该是打印一个值的地址,然后在骰子滚动后将指针向前移动数组中的许多位置,然后在下一次打印。

编辑:我不写一个链表。我试图做的一个确切的例子可以在这里找到:TutorialsPoint.com | C - Pointer arithmetic10然而,虽然我可以运行该示例代码,并使其工作完美,我的代码每次都失败。

编辑2:完整的源代码被要求

ProjectName.cpp

#include "TableOfContents.h" 
void main() 
{ 
FILE *fp;  //file reader 
char board[100] = " mHk nH l B He Flq p H hByHlho H B jr HFB ir j H F ku gd H pjB mH x BF i H m oB HlHFBhoH BB "; 
char *p1, *p2; // player 1 and player 2 
int turn = 1; 
srand(time(NULL)); // should only be called once 

       // int z[10]; // example of how to make an array 
/* 
fp = fopen("C:\\Users\\ritol\\Documents\\cities1.txt", "r"); 
inputLine = ""; 
inputP = &inputLine; // set inputP to the address for inputLine 
*/ 
p1 = &board[0]; 
p2 = &board[0]; 

fp = fopen("C:\\Users\\ritol\\Documents\\outputGameBoard.txt", "w"); 

while (turn <= 45) // 
{ 
    //output the current turn 

    //call the function move for p1 
    move(*p1, *p2, turn, board); 

    turn++;//TODO: only put this in it's correct place 

    //call the function move for p2 
    move(*p1, *p2, turn, board); 
    //increment turn 
    turn++; 

    //call output function to output current board to disk file 
    output(board, p1, p2, fp); 
} 

//determine and output the winner 

//Wait 
scanf("%d", &turn); 

} 

头文件:

#pragma once 
#ifndef TOC 
#define TOC 
#define _CRT_SECURE_NO_DEPRECATE 
#include<stdio.h> 
#include <stdlib.h> 
#include <time.h> 
/* 
Outputs the current game board to file 
*/ 
void output(char *board, char *p1, char *p2, FILE *myfile); 

/* 
Receives 
*p1 - player 1 pointer 
*p2 - player 2 pointer 
turn - the argument to determine which player to move 
*board - the size of the board 
Outputs the player number, randomly generates a move from 1-6 for the player, 
determines if the player has landed on an event, and moves accordingly, 
checks and handles player collison, 
outputs the amount the player moved and where they are now 
*/ 
void move(char **p1, char **p2, int turn, int boardSize); 

#endif 

Mechanics.cpp

#include "TableOfContents.h" 

void output(char *board, char *p1, char *p2, FILE *myfile) 
{ 
//the loop will exist once you have reached \0 
fprintf(myfile, "%s\n", board); 
//TODO: show the player locations 
} 


/* 
Moves a player and outputs the result of each players move 
*/ 
void move(char **p1, char **p2, int turn, int boardSize) 
{ 
//roll the dice 

int r = (int) (1 + (rand() % 5));  // returns a pseudo-random integer  from 1 to 6 

//REMOVE: tracer code 
if (r > 6 || r == 0) printf("The dice have sinned.\n"); 

//Apply the dice roll based on whose turn it is 
if (turn % 2 == 1)//Odd turn; Player 1's turn 
{ 
    printf("%p ", p1 + r); 
    *p1++; 
} 
else if (turn % 2 == 0) //Even turn; Player 2's turn 
{ 
    printf("%p\n", p2); 
    p2 += r; 
} 
} 
+0

你为什么要为'p1'和'p2'做不同的事情? –

+0

算术运行正常。你没有在任何地方分配结果。 –

+0

'c'中的所有内容都是按值传递的。当你将'p1'和'p2'传递给'move'时,这些指针的本地拷贝将在函数中完成,并且一旦函数退出就会丢失。如果你想实际改变'move'中的指针值,你需要将'p1'和'p2'的地址传递给'move',并将其定义改为'void move(char ** p1,char ** p2 ...)' – yano

回答

0

这整个事情是从我误读我应该做的事情。 我本来应该返回一个char指针,而不是函数void。

我现在很尴尬,我不介意这被删除。

0

首先,你P1并且p2变量在连续调用移动函数时不会改变,因为您正在按值传递指针。请参阅What's the difference between passing by reference vs. passing by value?

其次,代码中还有其他几个错误需要解决。这条线就是其中之一。它不会做你的评论说的。

int r = 1 + (rand() % 5);  // returns a pseudo-random integer from 1 to 6 
+0

接下来的一行是检查以确保r在该范围内,它完全符合我所评论的内容。 –

+0

'rand()%5'的取值范围是0到4.加1表示取值范围为1到5。 – stark

+0

啊,我明白了。我有一阵困惑,我并没有完全意识到我被告知这是一个比预期更小的范围。 –