0

ポインターに関して非常に奇妙な問題が発生しています。以下のコードからわかるように、ランダムな 4 x 4 文字のグリッドを生成するメソッドを使用しています。2 次元文字配列へのポインターを返します。問題は、返されたポインターを別のポインターに割り当てて、生成されたグリッドを印刷しようとすると、奇妙なシンボルが 1 つしか表示されないことです。

ヘッダー ファイル

#import <Foundation/Foundation.h>

@interface GridGenerator : NSObject
{
}
-(char (*)[4]) generateGrid;
-(int (*)[2]) bbb;
-(void) print;
@end

実装ファイル

#import "GridGenerator.h"

@implementation GridGenerator
-(char (*)[4])generateGrid{
    char vowels[6] = {'A','E','I','O','U','Y'};
    char consonants[20] = {'B','C','D','F','G','H','J','K','L','M','N','P','Q','R','S','T','V','W','X','Z'};
    char grid[4][4];
    int vowelsLength = (sizeof vowels / sizeof vowels[0]);
    int consLength = (sizeof consonants / sizeof consonants[0]);
    int gridSize = (sizeof grid / sizeof grid[0]);
    for(int i=0;i<gridSize;i++){
        int vowelsInGridRow = 0;
        int noOfVowels = (arc4random() % 2) + 1;
        for(int j=0;j<gridSize;j++){
            if(noOfVowels != vowelsInGridRow){
                int vowIndex = arc4random() % vowelsLength;
                char s = vowels[vowIndex];
                grid[i][j] = s;
                vowelsInGridRow++;
            }
            else{
                int consIndex = arc4random() % consLength;
                char s = consonants[consIndex];
                grid[i][j] = s;
            }
        }
    }


    char (*sd)[4]= grid;
    return sd;      
}
-(void)print{
    char (*grid)[4] = [self generateGrid];
    NSString *s = @"\n";
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            s = [s stringByAppendingString:[NSString stringWithFormat:@"%c",grid[i][j]]];

        }
        s = [s stringByAppendingString:@"\n"];
    }
    NSLog(@"%@",s);
}

メインファイル(テスト)

#import <Foundation/Foundation.h>
#import "Crossword.h"
#import "GridGenerator.h"
int main(int argc, const char * argv[])
{

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    GridGenerator *gen = [[GridGenerator alloc] init];

    [gen print];
    [pool release];
    return 0;
}

コードを実行すると、以下の結果が表示されます。「U」の後には、逆さまの疑問符があります (ここには貼り付けられません)。

2013-06-02 11:24:29.923 CrosswordTest[646:303]
う

これが起こる原因は何ですか?私はすでに数時間苦労していますが、説明が見つかりません。

4

1 に答える 1

2

一時への参照を返しています。爆発 (未定義の動作) が予想されます。

回避策。構造を作成します。

typedef struct {char at[4][4];} t_grid;

次にt_grid、値を入力して返します。

- (t_grid)generateGrid
{
  char vowels[6] = {'A','E','I','O','U','Y'};
  char consonants[20] = {'B','C','D','F','G','H','J','K','L','M','N','P','Q','R','S','T','V','W','X','Z'};
  t_grid grid;
  ...
  int gridSize = (sizeof grid.at / sizeof grid.at[0]);
  ...
    grid.at[i][j] = s;
  ...
  return grid;
}


- (void)print
{
  t_grid grid = [self generateGrid];
  ...

このアプローチは、大きな配列や可変長配列には使用しないでください。4*4 オクテットは小さいです。

于 2013-06-02T09:36:27.690 に答える