2017-10-12 22 views
-2

ポインタ演算を実行しようとしていますが、何らかの理由でポインターがループを終了した後にアドレスの変更を保持していません。ポインタ演算が機能していません

私の出力は、繰り返し印刷された配列(全配列)のポインタアドレスです。

1つの値のアドレスを印刷してから、ダイスロールがポインタをその配列の多くの場所で前方に移動させ、次回に印刷します。

編集:私はリンクリストを書いていません。私がしようとしていることの正確な例はここにあります:TutorialsPoint.com | C - Pointer arithmeticしかし、私はそのサンプルコードを実行して完全に動作することができますが、私のコードは毎回失敗します。

EDIT 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

このすべてのことは、私がしなければならないことを誤解していました。 私は、関数voidの代わりにcharポインタを返すことになっていました。

私は今や恥ずかしいです。私はこれが削除されても構いません。

0

まず、あなたのP1ポインタが値渡しであるため、p2変数はmove関数の連続呼び出しの間に変更されません。 What's the difference between passing by reference vs. passing by value?

第2に、コードにはいくつかのエラーがあります。この行はその一つです。あなたのコメントが言っていることはしません。

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

次の行は、rがその範囲内にあることを確認することです。これは私がコメントしたものとまったく同じです。 –

+0

'rand()%5'は0から4の範囲にあります.1を加えると1から5の範囲になります。それはどのように1から6ですか? – stark

+0

ああ、そうだ。私は混乱の瞬間がありました、そして、私はそれが予想よりも小さい範囲であると言われていたことを正確にはわかりませんでした。 –

関連する問題