- ベストアンサー
p[-3][-4]にアクセス出来るようにしたい
ポインタのポインタをうまく使って、p[-3][-4]のようなアクセス(が有効に行われるように)したいのですが、うまくいきません。 ご教授願えないでしょうか。 以下のコードで p[-3][0] を a[0][0] を参照させる(?)ようにはできました。 後ろ側の添え字のマイナスシフトができないのです。 つまり p[-3][-4] が a[0][0] を参照させるようにするギミックが知りたいのです。よろしくお願いします。 ------------------------------------- int **a; // 領域の動的確保 ( [12][18] ) a = new int*[12]; for(int i = 0; i < 12; i++) a[i] = new int[18]; int **p; p = &(a[3]) ; for (int y=0; y<12;y++) for (int x=0; x<18;x++) a[y][x] = 1; p[-3][0] = 99; //a[0][0]が99になる。 //領域の解放 for(int i = 0; i < 12; i++) delete [] a[i]; delete [] a;
- みんなの回答 (11)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (10)
- alfsan
- ベストアンサー率0% (0/2)
- jacta
- ベストアンサー率26% (845/3158)
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
- sha-girl
- ベストアンサー率52% (430/816)
- Interest
- ベストアンサー率31% (207/659)
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
- Interest
- ベストアンサー率31% (207/659)
関連するQ&A
- 初心者です。 配列のエラーがどうしても解決できません。 誰か助けてください・・・
魔方陣のプログラムを考えて書いてみましたが、 エラーが出てしまい実行することができません。 class mahoujin{ public static void main(String args[]){ int n=3; int a[][] = new int[3][3]; int x=0; int y=1; for(int p=0;p<=3;p++){ for(int q=0;q<=3;q++){ a[p][q]=0;} } for(int i=1;i<=n*n;i++){ if((i%n)==1){x++; }else{x--; y++;} if(x==0){x=3;} if(y==3){y=0;} a[x][y]=i;} } } 空の配列や配列を外れるものがあるかをよく考えてみましたが、どうしても解決できません。助けてください・・・
- 締切済み
- Java
- ポインタ配列の開放について
いつもお世話になっております。 C++言語初心者です。 ポインタ配列の開放(delete)について質問です。 ※includeは省略します。 int main(){ int *a[10]; for(int i=0;i<10;i++){ a[i]=new int[5]; } delete[] *a; return 0; } ポインタ配列を開放する場合、 上記のような書き方で正しいのでしょうか? ただ、上記のような記述方法が間違っている場合、 for(int i=0;i<10;i++){ delete[] a[i]; } とやるのはスマートでない気がするので、 もし他に方法がありましたらお願いします。
- ベストアンサー
- C・C++・C#
- 多次元配列の new
多次元配列を new すると、どのような型のサイズの領域の配列が確保されるんでしょうか?たとえば、 int (*a)[2] = new int[3][2]; とすると、 1. 長さ2のintの配列へのポインタ型の長さ3の配列の領域が確保される のか、 2. int[3][2] すなわち、int が 6 つ分の領域が確保される のか。 今まで、「そりゃあ 2 の方だろう」と信じ込んであまり考えずにいたんですが、「コードの型形式からすると 1 の方の解釈でもいいよなぁ」と、ふと思ったものですから、質問させていただきました。 わたしの環境で調べてみると(配列用のハウスキーピング的な余分の領域とか、パディングなどは無視して)、確かに 1 の方なんですか、これで標準準拠なんでしょうかね?^^; XP Home Edition Ver.2002 SP2 cygwin v.1.0.2-1 GNU g++ v.4.1.1 ===== #include <iostream> #include <new> #include <cstdlib> struct A { char a; void *operator new(std::size_t s) { void *p = std::malloc(s); std::cout << "A::new(): " << p << '\t' << s << '\n'; return p; } void operator delete(void *p, std::size_t s) { std::cout << "A::delete(): " << p << '\t' << s << '\n'; if (p) std::free(p); } void *operator new[](std::size_t s) { void *p = std::malloc(s); std::cout << "A::new[](): " << p << '\t' << s << '\n'; return p; } void operator delete[](void *p, std::size_t s) { std::cout << "A::delete[](): " << p << '\t' << s << '\n'; if (p) std::free(p); } }; int main() { std::cout << sizeof(char) << '\t' << sizeof(A) << '\t' << sizeof(A(*)[8]) << '\n'; A *a = new A; std::cout << a << '\n'; A *aa = new A[8]; std::cout << aa << '\n'; A (*aaa)[8] = new A[8][8]; std::cout << aaa << '\n'; A (*aaaa)[8][8] = new A[8][8][8]; std::cout << aaaa << '\n'; delete[] aaaa; delete[] aaa; delete[] aa; delete a; } ===== % ./a.exe 1 1 4 A::new(): 0x870668 1 0x870668 A::new[](): 0x870678 12 0x87067c A::new[](): 0x870688 68 0x87068c A::new[](): 0x8706d0 516 0x8706d4 A::delete[](): 0x8706d0 516 A::delete[](): 0x870688 68 A::delete[](): 0x870678 12 A::delete(): 0x870668 1
- 締切済み
- C・C++・C#
- newで生成したものをdelete[]で破棄するのは間違い?
int* p = new int(0); と確保したものを、普通は delete p; と書いて破棄しますが、代わりに delete[] p; と書いて破棄しても問題はないのでしょうか? 非常に悪いコードなのですが..... <1>: int* p = new int(0); <2>: int* p = new int[x]; //xはどこかで値を設定済み このうちの、1か2かのどちらかでpに対して領域を割り付けた場合に、どちらもdelete[]で破棄しても問題ないか? という意味の質問です。 コンパイルして実行しても特にエラーを吐くことはありませんでしたが非常に心配です。
- ベストアンサー
- C・C++・C#
- オブジェクトのコピー
以下のプログラムはVC++6.0(win2k上)で、 オブジェクトのコピーを練習するために書いたものです。 このプログラムは、コンパイルは通りますが、 実行エラーになります。どのように変更すればよいでしょうか? #include <iostream> #include <stdio.h> #include <assert.h> using namespace std; class Player{ int data; Player *p; public: Player(); ~Player(); Player(const Player & x); void SetData(int d){ data = d; } int GetData(){ return data; } //代入演算子 Player & operator=(const Player & x); }; Player & Player::operator = (const Player & x){ p = new Player; //Playerオブジェクトを別の場所に作る *p = *(x.p); //pの指すオブジェクトに、mのpが指すオブジェクトを代入 return *this; } Player::Player(const Player& x){ p = new Player; //Playerオブジェクトを別の場所に作る *p = *(x.p); //pの指すオブジェクトに、mのpが指すオブジェクトを代入 } class App { Player *p[3]; public: App(); ~App(){for(int i=0;i<3;i++)delete p[i];} //pの指すオブジェクトのデータを設定するだけ void SetData(int i1,int i2){ p[i1]->SetData(i2); } void init(){p[0]=new Player;p[1]=new Player;p[2]=new Player;} void copy(){p[0]=p[1];SetData(0,100);} void output(){ for(int i=0;i<3;i++)printf("%d\n",p[i]->GetData()); } }; void main() { App *x=new App; x->init(); for(int i=0;i<3;i++)x->SetData(i,i); x->copy(); x->output(); delete x; }
- ベストアンサー
- C・C++・C#
- C言語のポインタについて教えてください。
C言語のポインタについて教えてください。 ・pointer1.c int main(){ int a; int *p; p = &a; a = 123; printf("%d", *p); return 0; } ・pointer2.c int main(){ int a[100]; int *p; p = &a[0]; int i; for(i = 0; i < 100; i++) a[i] = i; for(i = 0; i < 100; i++) printf("%d", *p++); return 0; } と二つのソースコードがあるとき、pointer2.cの「p = &a[0]」をpointer1.cのように「p = &a」と書けないのはなぜですか? また、「&a」は動かすことのできなく、「aを指し示す*p」は動かすことができる変数のようなもの、という認識に誤りはないでしょうか? 宜しくお願いします。
- 締切済み
- C・C++・C#
- NoSuchMethodErrorが解決できません。
実行時エラーNoSuchMethodErrorが出て困っています。 どこを修正すればいいのでしょうか? class A implements Runnable{ int x; int y; public void run(){ for(int i = 0;i < 100;i++){ x++; y++; System.out.println("x="+x+"y="+y); } } } class B{ public static void main(String args[]){ new Thread(new A()).start(); new Thread(new A()).start(); } }
- ベストアンサー
- Java
- fprintfでの文字化け
Cで作ったプログラムなのですが最後の部分でファイルに出力すると数字が 文字化けして出てきます(‰など)その原因を教えて頂ければ嬉しいです 他にも何かあれば教えてください プログラミングは詳しくないのでゴロゴロ見つかるかもしれません 【プログラム】 #include <stdio.h> #include <math.h> #include <stdlib.h> #include <time.h> int a,i,j,k,t; double p,p1,b; int X[999][1000],Y[999][1000]; int s0,s1,delta; int main(void) { int**X = calloc(sizeof(int),sizeof(int)*1000); int**Y = calloc(sizeof(int),sizeof(int)*1000); FILE *output; output=fopen("monte.dat","w"); b = 0.01; /*逆温度*/ srand((unsigned int)time(0)); /*メモリの確保*/ if( X == NULL ){ exit( EXIT_FAILURE ); } for(i=0; i<=999; ++i){ /* 各列分の領域を割り当てる */ X[i] = (int*)calloc(sizeof(int),sizeof(int)*1000); } if( Y == NULL ){ exit( EXIT_FAILURE ); } for(i=0; i<=999; ++i){ /* 各列分の領域を割り当てる */ Y[i] = (int*)calloc(sizeof(int),sizeof(int)*1000); } /*終わり*/ /*初期配列の設定*/ for(i=0;i<1000;i++){ X[0][i]=a; a = (int)((rand() / ((double)RAND_MAX+1.0)) * 2);//debag } /*終わり*/ for(t=0;t<2;t++){ //debag /*配列中a番目を抽出*/ a = 10; //debag /*終わり*/ /*a番目のスピンを逆にした配列作成*/ for(j=0;j<1000;j++){ Y[t][j] = X[t][j]; } Y[t][a] = (X[t][a]+1)%2; /*終わり*/ /*遷移確率p1計算*/ s0=0; s1=0; for(k=0;k<1000;k++){ s0=s0+pow(-1,X[t][k]+X[t][k+1]);//(11),(00)なら値1 s1=s1+pow(-1,Y[t][k]+Y[t][k+1]);//(10),(01)なら値-1 } delta = -s1 + s0; p1 = 0.5 * (1 - tanh(0.5 * b * delta)); printf("%d %d %d %f ",s0,s1,delta,p1); //←この時点ではX[t][]は正しく出力する /*終わり*/ /*新しい配列(i番目の符号を交換するか)*/ p = (double)((rand() / ((double)RAND_MAX+1.0)) * 1); for(j=0;j<1000;j++){ X[t+1][j] = X[t][j]; } if(p<=p1){ X[t+1][a] = (X[t][a]+1)%2; printf("交換したよ! %d → %d\n",X[t][a],X[t+1][a]); } else{ X[t+1][a] = X[t][a]; printf("交換しないよ!\n"); } /*終わり*/ } /*記入*/ for(i=0;i<1000;i++){ fprintf(output,"%d ",X[0][i]); //←ここが文字化けする } fprintf(output,"\n"); for(i=0;i<1000;i++){ fprintf(output,"%d ",Y[0][i]); //←出力されない } /*終わり*/ fclose(output); return 0; } 【プログラム終】
- ベストアンサー
- C・C++・C#
- C++で領域の確保の方法
今C++の勉強中なのですが、 領域の確保の方法でいい方法が知りたいのです。 ポインターのポインターを使って二次元配列の領域を確保したいのですがいい方法が思いつきません。 int **pBox; pBox = new int *[ 10 ]; for( int i=0; i<10; i++ ) { pBox[ i ] = new int[10]; } //ちなみに今はこんな感じのものしか考え付きませんint型[10][10] を確保したつもりです。 間違っていたら教えていただきたいです。 本題はこちらで、もっと効率のいい確保の方法を知りたいのでご協力を よろしくお願いします。
- 締切済み
- C・C++・C#
- ポインタ配列
"one","two","three","four","five","six","seven","eight","nine","ten" のポインタ配列の文字列を、ASCIIコード順に並べ変えようと思ったのですが、 もうどこが間違っているかさえわからないぐらいになってしまいました。 まだまだはじめたばかりなもので、わからないことだらけなんで、 できるだけわかりやすい説明おねがいします。 関数の引数に問題があるのじゃないかと思ったのですが、 何かいいアドバイスありましたら、お願いします。 #include <stdio.h> /* 関数のプロトタイプ宣言 */ int strmp(char *,char *); void cpy(char *,char *); int main (void) { /* ポインタ配列の定義 */ char *x[10]={"oneee","twooo","three","fourr","fivee","sixxx","seven","eight","ninee","tennn"}; /* ポインタのポインタの定義 */ char **pp=x; char k[100]; char *p=k; int i,t,a,b,c,d; a=0; /* ポインタ配列を自作関数を使って、ASCIIコードの大きいほうからに並び替える */ for(i=0;i<9;i++) { for(t=1;t<10;t++) { a=strmp(*(pp+i),*(pp+t)); if(a<0) { cpy(p,*(pp+i) ); cpy(*(pp+i),*(pp+t) ); cpy(*(pp+t),p); } } } for(i=0;i<10;i++) { printf("%s ,",x[i]); } printf("\n"); return 0; } /* 文字の比較をする関数 */ int strmp(char *x,char *y) { int i; for(i=0;*(x+i)==*(y+i);i++) { if( *(x+i)=='\0') { return 0; } } return *(x+i)-*(y+i); } /* 文字をコピーする関数 */ void cpy(char *a,char *b) { int i; for(i=0;*(b+i)!='\0';i++) { *(a+i)=*(b+i); } *(a+i)='\0'; }
- ベストアンサー
- C・C++・C#
お礼
素晴らしいです。感動しました。 こんなに早く目的通りの回答をいただきありがとうございました。 (念のためもう1日程待ってから閉めたいと思います。)