C言語なら俺に聞け(入門篇) Part 7
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/01/29(月) 19:03:00・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 6
Part 6 http://pc10.2ch.net/test/read.cgi/tech/1167325490/
過去スレ
Part 1 http://pc8.2ch.net/test/read.cgi/tech/1146700389/
Part 2 http://pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 http://pc8.2ch.net/test/read.cgi/tech/1160682950/
Part 4 http://pc8.2ch.net/test/read.cgi/tech/1162999861/
Part 5 http://pc8.2ch.net/test/read.cgi/tech/1165022193/
関連スレ
C/C++の宿題を片付けます 82代目
http://pc10.2ch.net/test/read.cgi/tech/1169575464/l50
くだすれC言語(初心者用)
http://pc10.2ch.net/test/read.cgi/tech/1153542424/l50
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
http://pc10.2ch.net/test/read.cgi/tech/1159613789/l50
【初心者歓迎】C/C++室 Ver.34【環境依存OK】
http://pc10.2ch.net/test/read.cgi/tech/1169039760/l50
【C 関数検索 man on WWW】 http://www.linux.or.jp/JM/index.html
0232デフォルトの名無しさん
2007/02/06(火) 00:01:57期限:2月7日
を忘れてるぞ
0233デフォルトの名無しさん
2007/02/06(火) 00:06:17以下のやり方でソース書いて実行したら一応初期化されてる
けど、unionでconst使うの?
#include <stdio.h>
typedef struct{
union UNI{
const long* plong;
const short* pshort;
}uni;
}ST_Hoge;
int main()
{
int i;
const short s_area[] = { 1, 2 ,3, 4, 5 };
const ST_Hoge st = {(long *)s_area};
for(i = 0; i < 5; i++)
printf("%d ",st.uni.pshort[i]);
putchar('\n');
return 0;
}
0234デフォルトの名無しさん
2007/02/06(火) 00:08:35ちなみに17:40までだな
0235デフォルトの名無しさん
2007/02/06(火) 00:14:53>const ST_Hoge st = {(long *)s_area};
ポインタのキャストは
今回は使えないことになっているので。
なぜunionを使うかというと
書いていないですがST_Hoge構造体には他にもメンバがいて、
できるだけ構造体のサイズを小さくしたいので同時に使わないポインタは
unionで纏めたいのです。
0236デフォルトの名無しさん
2007/02/06(火) 00:19:31ROM領域にデータを置いておく必要があるので
constで定義しています。
0237デフォルトの名無しさん
2007/02/06(火) 00:23:53二分木に 1〜10 の順で登録した時にはどうなる?
0238デフォルトの名無しさん
2007/02/06(火) 00:23:580239デフォルトの名無しさん
2007/02/06(火) 00:27:57しとけば。キャストは暗黙で済んじゃうから。
0240デフォルトの名無しさん
2007/02/06(火) 00:32:55アラインメントは分かってる?
0241デフォルトの名無しさん
2007/02/06(火) 00:34:57何かconstの用法間違ってる気がする...、unionメンバのconst要らんように思うが
ま、何したいのか、良くわからんのでなんとも言えんが
ST_Hoge st_hoge 変数で、ROM内の定数のアドレスを共有出来るようにしたいってこと?
0242デフォルトの名無しさん
2007/02/06(火) 00:57:58>>239
ポインタのキャストはできません。
コーディング規約で縛られているので。
>>240
わかっていないと思います。
4byteバウンダリのことですか?
>>241
>>226のグローバルの定義があって、その後に
void main() {
int i;
for( i=0; i < 5; ++i )
printf("st_hoge.un_point.pshort[%d] = %d\n", i, st_hoge.un_point.pshort[i]);
~~~~~~
↑pshortでアクセスすることが大事
}
で1, 2, 3, 4, 5と正確にアクセスしたいです。
0243デフォルトの名無しさん
2007/02/06(火) 03:07:46#include <stdio.h>
const long l_area[] = { 100, 200, 300, 400, 500};
const short s_area[] = { 1, 2 ,3, 4, 5 };
/* 構造体定義 */
typedef struct _ST_Hoge {
union {
const long *pLong;
const short *pShort;
} un_point;
} ST_Hoge;
int main()
{
int i;
ST_Hoge st;
st.un_point.pShort = &s_area[0];
for(i = 0; i < 5; i++)
printf("%d ",st.un_point.pShort[i]);
putchar('\n');
st.un_point.pLong = &l_area[0];
for(i = 0; i < 5; i++)
printf("%d ",st.un_point.pLong[i]);
putchar('\n');
return 0;
}
0244デフォルトの名無しさん
2007/02/06(火) 03:23:54組み込みでROM領域ってことは代入はできないと思うんだ
0245デフォルトの名無しさん
2007/02/06(火) 03:32:370246デフォルトの名無しさん
2007/02/06(火) 03:37:39st.un_point.pShort = &s_area[0];
これ駄目あるか、ROMの扱いって難しいあるね
0247デフォルトの名無しさん
2007/02/06(火) 04:15:510248デフォルトの名無しさん
2007/02/06(火) 06:08:00老師、const ST_Hoge st_hoge、 このconst何のためにあるニダ?
中国3万年の歴史をもってしても不明あるニダ
>>242 努力加油!
0249デフォルトの名無しさん
2007/02/06(火) 06:47:470250デフォルトの名無しさん
2007/02/06(火) 07:24:491.コーディング規約を無視してキャストする。
2.暗黙のキャストは許可されると解釈して、
const void *を共用体の先頭にもってくる。
というか暗黙のキャストが不可なら、void*は使えないってことか?
3.コンパイラをC99対応のものに換えて、>229
4.諦める
0251デフォルトの名無しさん
2007/02/06(火) 07:30:40多分漫画か何かでキャラ作りの為に中国人キャラがそう喋ってたんだろ
んで在日中国人でそれを真似る奴も現れた
本場の中国人が日本語覚えたてだとアグネスみたいになる
>248
一瞬、素が出ててヮロタw
0252デフォルトの名無しさん
2007/02/06(火) 07:32:54>247
http://ja.wikipedia.org/wiki/%E5%8D%94%E5%92%8C%E8%AA%9E
0253デフォルトの名無しさん
2007/02/06(火) 07:48:38定義の時だけ共用体の順序を弄るのはどうだ?(w
a.c: struct st_hoge_impl{ const short *ps } st_hoge = { &s_area[0] };
b.c: extern ST_Hoge st_hoge_impl;
0254デフォルトの名無しさん
2007/02/06(火) 08:01:19何気に日帝残滓
って日本なんだから当たり前かw
0255デフォルトの名無しさん
2007/02/06(火) 18:09:38ST_Hoge st;
st.un_point.pShort = s_area;
は一応出来るだろ。
ただ、用件がconst ST_Hoge stになってるから困ってるんだと思う。
ついでに俺が思うのはunionでも構造体でも
ポインタ変数使ってるならmalloc()で領域確保しないと
後からバグの温床になるような気がする。
線形リストなりのリストにしたらどうなるんだろう。
静的な例えばchar *str = "abc"とかならコンパイル時に
メモリーにそのまま置かれるはずだと思ってるんだけど
構造体とかのメンバでのポインタ変数にオブジェクトの初期化で
constだからと言ってアドレスだけそのままわたして
でもC言語だからcont char *constなんてできないだろうし・・・・
わっかんねーや。
0256デフォルトの名無しさん
2007/02/06(火) 23:06:42入力はそのまま文字を入力してテキストに出力、メニューに戻る
出力1は、そのテキストをそのまま写し、メニューに戻る
出力2は、テキストに改行しかない行(要するに何もない行です)があった場合そこで出力を止めてメニューに戻る
というのを作りたいのですが、最後の出力2だけができません。
ヌル文字で判断するようにしてら一番最初の行で出力終わっちゃうしorz
どのように「文字が何もない」ことを判断させればいいのでしょうか?どなたかご教授お願いします。
0257デフォルトの名無しさん
2007/02/06(火) 23:13:020258デフォルトの名無しさん
2007/02/06(火) 23:15:14>>257
すばやい回答ありがとうございます。
(;´Д`)言われてみればそうですネ・・・
0259デフォルトの名無しさん
2007/02/06(火) 23:15:26char *token
char *gDlim = " \t\n"
temp = fgets()
if((temp = strtok(temp,gDlim)) == NULL){
文字無し
else
文字有り
0260デフォルトの名無しさん
2007/02/06(火) 23:32:26・使い方に癖がある。
・スレッドセーフではない。
・バグを発生させやすい。
ラッパ関数を用意すれば使い勝手は改善するが、
それ位ならsscanf()で%[](文字セット)を使うほうがマシ。
0261デフォルトの名無しさん
2007/02/06(火) 23:33:44temp = fgets();
これも問題にして欲しいな、僕は。
0262デフォルトの名無しさん
2007/02/07(水) 00:12:00してくれ。
0263デフォルトの名無しさん
2007/02/07(水) 00:29:51このプロトタイプ宣言を自作ヘッダファイルに記述してインクルードしようとしたら
エラー E2147 引数宣言は 'FILE' で始められない
*** 1 errors in Compile ***
と表示されてコンパイルできません。
何が問題なんでしょうか?
0264デフォルトの名無しさん
2007/02/07(水) 00:34:32自作関数のプロトタイプ宣言の前に
#include<stdio.h>
してみては?
0265デフォルトの名無しさん
2007/02/07(水) 00:41:40ありがとうございます。解決しました。
よくよく考えれば至極当然の事でしたorz
誰か俺を殴ってくれ。
0266デフォルトの名無しさん
2007/02/07(水) 01:05:27誤差のある理由をレポートにしなきゃいけないんだが、なにか良い案はないか?
11項より後の項を切るんだから誤差が出るのはわかるんだが、もうちょっと詳しく知りたいのだ。
0267デフォルトの名無しさん
2007/02/07(水) 01:08:57それ以上何か?
0268デフォルトの名無しさん
2007/02/07(水) 01:10:420269デフォルトの名無しさん
2007/02/07(水) 01:12:11main(){
char s[] = "I love dog and cat.";
char c = 'a';
char *p = s;
int n = 0;
printf("\"%s\"の中から\'%c\'を探します。\n",s,c);
while(*p != '0'){
if(*p == c){
printf("%d文字目で発見しました。\n"p-s+1);
n++;
}
p++;
}
if(n == 0)
printf("1個も見つかりませんでした。\n");
else
printf("全部で%d個見つかりました。\n",n);
return 0;
}
エラー E2121 sample13.c 12: 関数呼び出しに ) がない(関数 main )
*** 1 errors in Compile ***
これが、どうしても見つからないので、ご指摘お願い致します。
0270269
2007/02/07(水) 01:12:560271デフォルトの名無しさん
2007/02/07(水) 01:13:57p-s+1
の前にカンマ , が無いだけかな?
0272デフォルトの名無しさん
2007/02/07(水) 01:16:00読み取れる上限が決まるわけであって、
限界は1024までで設定されてるとかいうのは、デマだよな?
0273改めて質問させて戴きます-269
2007/02/07(水) 01:20:11main(){
char s[] = "I love dog and cat.";
char c = 'a';
char *p = s;
int n = 0;
printf("\"%s\"の中から\'%c\'を探します。\n",s,c);
while(*p != '\0'){
if(*p == c){
printf("%d文字目で発見しました。\n",p-s+1);
n++;
}
p++;
}
if(n == 0)
printf("1個も見つかりませんでした。\n");
else
printf("全部で%d個見つかりました。\n",n);
return 0;
}
この、ソースでよくわからない部分が多数有ります。
参考書には解説が無く困っていますので、アドバイスの方を
宜しくお願いします。
0274デフォルトの名無しさん
2007/02/07(水) 01:24:43デマ。もしそれが本当である処理系なんてあったら、そんなもの窓から投げ捨てろ。
>>273
多数であって無数ではないんだろ。
どこがわからないのか1つ1つ挙げてみろ。
0275改めて質問させて戴きます-273
2007/02/07(水) 01:26:11char *p = s; は char s[] = "I love dog and cat."; を指しているのでしょうか?
二つ目は、whileの中にif文があるやつが、わかりませんので
解説をして戴ければ、ありがたいです。forの二重ループとは、違いますよね?
三つ目は、p-s+1 の意味です、これが何だかわかりません。
特にp-sとは・・・・?
四つ目は、n++とP++ です、これのp++の方は
参考書に、”探し当てた文字の次から探します。”と
だけ書いてあります。なら、n++は何なんでしょうか?
これらの、四つがわかりません。
0276デフォルトの名無しさん
2007/02/07(水) 01:45:18int main(){
char c = 'a';
char *p = "I love dog and cat.";
int n = 0, k = 1;
printf("\"%s\"の中から\'%c\'を探します。\n",p,c);
while(*p){
if(*p == c){
printf("%d文字目で発見しました。\n",k);
n++;
}
p++;
k++;
}
if(n == 0)
printf("1個も見つかりませんでした。\n");
else
printf("全部で%d個見つかりました。\n",n);
return 0;
}
0277デフォルトの名無しさん
2007/02/07(水) 01:51:520278デフォルトの名無しさん
2007/02/07(水) 01:54:17(1) pにはs[0]のアドレスが代入される
(2) pが指している文字がcに等しいかどうか判断
(3) pに入っているアドレスからs[0]のアドレスを引いて1を足す
pがs[0]に等しければp-s[0]+1は1になりprintf("%d文字目で発見しました。\n",p-s+1);は1文字目で〜と出力される
(4) printf("全部で%d個見つかりました。\n",n);を見れば分かるように配列sの中にあるcと同じ文字の個数
>>277
必要になってから覚えればいい
必要を感じないものは覚えにくいものだし面白くもない
0279デフォルトの名無しさん
2007/02/07(水) 01:55:35世の中の少なくとも過半数の人は覚える必要が無い
自転車の運転が難しいっていうのと同じようなもの
できるようになれば、何で分からなかったのかが不思議なくらい
0280デフォルトの名無しさん
2007/02/07(水) 01:56:36>>276
>>275
0281デフォルトの名無しさん
2007/02/07(水) 02:03:53(4) pが指している文字がcに等しいかどうか判断して等しければnの値を1増やす
最終的には>>278の(4)の通り
0282276
2007/02/07(水) 02:13:00軽く書き直して説明つけようかと思ったけど
めんどくせ!!
って思ったから、書かなかった。
紛らわしい事してごめんね。
0283デフォルトの名無しさん
2007/02/07(水) 02:18:02(2)whileになってるのは検索文字列の終端(〜cat\0)まで繰り返させるため。
全文字数が分っていればfor文でも出来るだろうが検索文字数が変わったときに
for文での上限の書き換えが必要になる。
その上でif文で検索文字'a'と同一か判定してる。
無ければif文を飛ばしてp++でwhile文に戻って次の文字との照合を行う。
あとは>>278の説明通りかと。
0284275
2007/02/07(水) 02:23:05>>276
>>278
>>281
>>283
皆さんの、アドバイスを読んで考えていますが
ちょっと、考えれば考えるほど混乱?してしまっているので
頭を冷やしてから、考え直し、再度質問させて戴きます。
0285デフォルトの名無しさん
2007/02/07(水) 02:39:36かような仕儀にござりましょう。
0286デフォルトの名無しさん
2007/02/07(水) 03:17:35(c >= '0' && c <= '9')
とするのが多いの? 俺は
( '0' <= c && c <= '9')
の方がわかりやすいと思うんだ。
ちなみに、K&Rは前者形式だった。
0287デフォルトの名無しさん
2007/02/07(水) 03:20:110288デフォルトの名無しさん
2007/02/07(水) 03:25:04後者を支持する人は、「数直線」を持ち出して「自然だ」と言い張る。
範囲を扱わないときには普通に>を使うのは全く気にならないらしい。
一方前者を指示する人は、「比較対照が常に前」ということで全て済ませてしまうらしい。
0289デフォルトの名無しさん
2007/02/07(水) 03:25:53p-s+1を一度pにして実行してみて欲しい。
こちらの環境では12番目〜が2293459番目で〜になり
17番目で〜が2293464番目で〜と表示される。
あなたの環境でも同じ番号には成らずとも�dでもない桁数での表示なる。
s[]はs[0]をスタートにしてI love dog and cat.と終端文字'\0'の19個分、s[0]〜s[18]まで用意される。
p-s+1で行っているのはprintf("%d文字目で発見しました。\n",p-s+1);実行時の
pのアドレス番地からスタート地点s[0]のアドレス番地を引いた数+1を行う.
アドレス番地s[0]は必ずしも0番から始まっているわけではないので上記で表示された�dでもない番地は
実際に12番目と17番目の'a'が入っているアドレス番地になる。
上記での例で行くとs[0]の実際の番地は2293448番地となりここをスタート番地として動く。
p-s+1で実際に計算してみると
2293459番地(pの現在番地)-2293448番地(スタート番地)+1
で答え12を引き出すことが出来る。
0290デフォルトの名無しさん
2007/02/07(水) 03:35:19なるほど、前者がそうなる理由を理解できないことはないと感じた。
でも、俺はずっと後者使うな。 前者はなんか気持ち悪いぞ。
0291デフォルトの名無しさん
2007/02/07(水) 04:04:04ポインタ ≠ アドレス
なのに、その説明だと誤解しそう
#include<stdio.h>
int main(void){
int a[2];
printf("%p %p %d\n", &a[0], &a[1], (&a[1])-(&a[0]));
return 0;
}
0292デフォルトの名無しさん
2007/02/07(水) 05:09:210293デフォルトの名無しさん
2007/02/07(水) 05:51:16質問の内容があいまいすぎて、わかんねーよ。
例えば
int *hoge = "abc";ってポインタ変数宣言して初期化してコンパイルしたら
hogeは、それ自身アドレス持ってるし
hogeは、"abc"で初期化されててコンパイル時にメモリーにそのまま置かれるし
コンパイルしてリンクずみのEXEを作ったとしたら
メモリーには変数のための領域、関数のための領域、スタックのための領域
ヒープのための領域が確保されて、EXEを実行してソース内でポインタ変数
をつかってヒープから領域確保して、ソース内でfreeせずじゃんじゃん
mallocでヒープから領域確保してたらメモリ足りなくなるし
再帰とかで関数スタックにつんでったらそのうちスタックオーバーフローするし
えーっと・・・
やっぱ、質問の意図がわかんね
0294デフォルトの名無しさん
2007/02/07(水) 05:51:56ポインタに入ってるのはアドレスの値
アドレスは機械語から使われている用語
ポインタは高級言語がアドレスを扱う為の概念の一つ
ポインタはアドレスしか指さない
アドレスは文字列や配列や関数にも存在する
0295デフォルトの名無しさん
2007/02/07(水) 05:53:13アドレスは値でポインタは概念?俺も混乱してきた
0296デフォルトの名無しさん
2007/02/07(水) 06:03:55後ろから前の個数を数えて算出してるの?でも、+1が不明だ
0297デフォルトの名無しさん
2007/02/07(水) 06:09:590298デフォルトの名無しさん
2007/02/07(水) 06:23:240299デフォルトの名無しさん
2007/02/07(水) 06:30:00pはaを指してるの?でsはs[0]?でしょうかね?
0300デフォルトの名無しさん
2007/02/07(水) 06:35:130301デフォルトの名無しさん
2007/02/07(水) 07:45:56...は引数の型や個数が決められていない。好きに使えるってことだよ。
0302デフォルトの名無しさん
2007/02/07(水) 08:27:25ありがとうございます。
0303デフォルトの名無しさん
2007/02/07(水) 09:19:40コーディング規約で何か決まってない限りは、おれは不等号に<と<=以外は使わないようにしているよ。
自然かどうかはしらんが、数直線を思い起こせばおれの足りない脳でもすぐ理解できるからね。
0304デフォルトの名無しさん
2007/02/07(水) 12:36:21可変個引数を使う関数を自前で作るには
<stdarg.h>をインクルードヘッダを追加して
va_list
va_start
va_arg
va_end
の処理をその関数内でしなきゃならない。
最初は知って便利だと思って頻繁に使うかもしれないけど
正直そういう関数はあまり好ましくない
C++では、そういう関数はダメ
0305デフォルトの名無しさん
2007/02/07(水) 21:29:08434
344
など3桁の整数が書かれてるテキストを読んで
344など4が2回出てくるやつだけ取り出すにはどうすればいいですか
0306デフォルトの名無しさん
2007/02/07(水) 21:58:254の数を数えればいい。
何がわからないんだ?
0307226
2007/02/07(水) 23:11:56結局、今回の初期化はコーディング規約を破って
キャストして入れることになりました。
答えてくださった方
ありがとうございました。
0308275
2007/02/07(水) 23:25:20幾ら考えても、どうしても、
>>(3) pに入っているアドレスからs[0]のアドレスを引いて1を足す
がわかりません。
もう一度、解説お願い致します。
>>289の解説を読む限りでは
>>(1) pにはs[0]のアドレスが代入される
これは、s[0] = Iのアドレスと解釈しても宜しいのでしょうか?
例、s[12]ならアドレスは1245059
やはり、p−s+1がいまいちピンときません
pとは何なのか、sが何なのか・・・・など。
>>289
実行したら、こうなりました
"I love dog and cat."の中から'a'を探します。
1245059文字目で発見しました。
1245064文字目で発見しました。
全部で2個見つかりました。
>>pのアドレス番地からスタート地点s[0]のアドレス番地を引いた数+1を行う.
もう少し詳細に説明して戴けると、幸いです。
0309デフォルトの名無しさん
2007/02/07(水) 23:29:140310デフォルトの名無しさん
2007/02/07(水) 23:31:36C言語じゃないし
何のアセンブラなのかもいわないし
0311デフォルトの名無しさん
2007/02/07(水) 23:35:290312デフォルトの名無しさん
2007/02/07(水) 23:40:01以下の文字列があるとします
文字列 s = "abcdefgh"
a のある位置は0でhは7ですね(s[0]=='a' であり s[7]=='h')
p−s+1
この式では s=0 となります
次にpについて考えますが p=4 としましょう
pは'e'をさしているのは分かりますね
では p - s はいくつでしょうか?4ですよね
ところで'e'は文字列 s において何文字目にありますか?
5文字目ですよね.とすると 式 p−s では文字列 s において 位置pがさす文字は何文字目であるか?という答えと一致しません
これは最初の0番目をカウントしていないからです
そこでp−s+1 と+1することで0番目の文字もカウントするようにしているのです
0314デフォルトの名無しさん
2007/02/07(水) 23:50:170315275
2007/02/07(水) 23:57:37ご返答、ありがとうごいます。
>>p−s+1
この式では s=0 となります。
s=0 は配列が最初の値を指しているから"0"と
解釈してもいいのでしょうか?
>>ところで'e'は文字列 s において何文字目にありますか?
5文字目ですよね
自分なりの解釈では、>>これは最初の0番目をカウントしていないからです
そこでp−s+1 と+1することで0番目の文字もカウントするようにしているのです
が関係してるから'e'は4でなく、5だと思うのですが
普通は0から数えるから、'e'は4なのでは???
0316275
2007/02/08(木) 00:06:550から数えるのではではないと、わかりました(ピンときました)
普通に数えていいみたいですね。
0317312
2007/02/08(木) 00:07:48それは配列のインデックスの話ですね
インデックスでは'a'は0番目であり、'e'は4番目ですが
表示上、'a'を1文字目とする場合、'e'は5文字目とならなければいけません
s[0]='a'; 1文字目
s[1]='b'; 2文字目
s[2]='c'; 3文字目
s[3]='d'; 4文字目
s[4]='e'; 5文字目
p−s+1 という式は上記の〜文字目を出す式です
s[〜]のインデックス値を出すだけなら p - s でいいんですけどね
あなたは「プログラム上のインデックス」と「日常のインデックス」を混同してませんか?
0319デフォルトの名無しさん
2007/02/08(木) 00:18:26俺は、みんながこんなにレスしてる事に感激です。
俺の意見:
もっと書籍読んで勉強しろよ
入門レベルだからこんな事言っちゃだめなんだろうけどよ
0320275
2007/02/08(木) 00:18:38丁寧な解説、ありがとうごいます。
何故、引けばその何文字目かが算出されるのかや
>>289さんが、説明してくれたアドレス云々や(pのアドレスから??)
>>278さんの>>(1) pにはs[0]のアドレスが代入される
などが、かなりごっちゃになってしまって、
考えても、今の段階(能力では)理解しがたいので
飛ばします・・・本当にありがとうございました。
0321275
2007/02/08(木) 00:20:06そうします、もっと簡単な参考書を探して勉強し直します。
自分がここを占領してしまったら、悪いですし
ありがとうございました。。。
0322デフォルトの名無しさん
2007/02/08(木) 00:57:130323275
2007/02/08(木) 01:15:41諦めきれず飛ばせず何度もレスを読み直しまし
80%とは何とか理解できました!!!
最後の質問に致しますので、ご返答戴ければ幸いです。
最後に3つだけ、質問させて下さい
”s=0” は決まってるのでしょうか?
決まっているとしたら、どうしてなのか?
>>278さんの >> pにはs[0]のアドレスが代入される
は、今回はアドレスと切り離して考えてもいいでしょうか?
ポインタpはsの'I',' ','l','o','v','e'の各アドレスを指しているのでしょうか?
これがわかればもう悔いはありません。
0324312
2007/02/08(木) 01:18:56そうですか、一度に全部ではなく、少しずつ覚えるのがいいですよ.
それでは最後に・・・
文字列 "abcdefgh" があったとします.
仮に何も書かれていないカードが6枚あったとします.その後にa〜hまで書かれたカードが並んでるとして説明します
このカードを文字列として考えましょう.
空白 0番地
空白 1番地
空白 2番地
空白 3番地
空白 4番地
空白 5番地
s[0]='a'; 6番地
s[1]='b'; 7番地
s[2]='c'; 8番地
s[3]='d'; 9番地
s[4]='e'; 10番地
s[5]='f'; 11番地
s[6]='g'; 12番地
s[7]='h'; 13番地
↓続きます↓
0325312
2007/02/08(木) 01:21:57またリロード忘れましたorz
こちらの質問には再度レスします
↓先ほどの続き↓
まず、文字列とはなにか.上の文字列で説明します.文字列とは a を先頭にb,c,d,…と連続に続いたものですよね.
ではこの文字列を表現するためにはどうしますか?もっとも簡単なのは先頭の位置だけを記憶しておいて、後は順に隣を見る、という方法ですね
まずa〜hまでの文字列を s とします.文字列 s を表現するには文字列の先頭の位置を記憶すればいいんでしたよね
つまり s には文字列"a〜h"の先頭の文字 'a' の位置が記憶されているわけです.'a'の位置は 6番地 ですよね
では 'e' の位置は何番地でしょうか?そして文字列 s において何番目の文字でしょうか?
'e'は10番地ですね.では 'e' が文字列 s において何番目か計算してみましょう.
p−s+1 という式において p は'e'の位置 10 が、 s は文字列 s の先頭番地6が入っています.
10-6は4です.そこに1を足すと5になります.よって文字' e' は文字列 s の 5番目ということになります
実際に数えてみると、確かに5番目ですね.
では p-s とした場合どうでしょうか.答えは4になり実際の値とは違います.
先ほども説明しましたが、これは s[0]='a'; 自身が数えに含まれていないからです.
p-s とした場合常に s[0] が含まれないわけですから +1 とすればつじつまが合うようになります.
0326デフォルトの名無しさん
2007/02/08(木) 01:23:58s=0は間違い
sは実際には適当なアドレスが入る。
pに初期値としてsを代入するからp-sが0から始まるってことで簡略化したんだろうが、
混乱させるからよくないな。
二つ目の質問の意味は良くわからん。
三つ目は、その通り。
pは'I'のアドレスから終端文字のアドレスまで順番に変化する。
0327312
2007/02/08(木) 01:33:08>”s=0” は決まってるのでしょうか?
決まってはいません.sの値は>>324-325の文字列の表現の仕方をみてください
私が書いたのは説明の便宜上のためです.
> >>278さんの >> pにはs[0]のアドレスが代入される
>は、今回はアドレスと切り離して考えてもいいでしょうか?
切り離す・・・のはよくないかと.どの問題と切り離すのかが分からないですが.
「pにはs[0]のアドレスが代入される」というのはp に文字列 s の先頭番地を入れておくということです
そして pが指している文字がcに等しいかどうか判断し、等しくなければ p を1つ隣に進めます( p++ と言う処理は p に 1を足している)
この操作によって 今度の p はs[1]のアドレスをさすことになります.
>ポインタpはsの'I',' ','l','o','v','e'の各アドレスを指しているのでしょうか?
そうですね.p++ と言う処理によって各アドレスをさすようになります
0328デフォルトの名無しさん
2007/02/08(木) 01:35:49本買ってもう少し自分で勉強しなさい。
ここまでくると他の人が質問しづらい
0329275
2007/02/08(木) 01:38:38>>325
>>326
何から何まで親切に、ありがとうございました。
よく、こんな難しいのがわかりますね。
あとは自力で考え込んで理解します。
0330デフォルトの名無しさん
2007/02/08(木) 01:46:42題名には謳っているけど、最初だけ簡単に説明して
サンプルや練習問題でいきなり難しくなるのって多いと思う
俺もここで訊かなきゃ挫折していたよ
by俺の経験談
0331デフォルトの名無しさん
2007/02/08(木) 02:23:46月刊オープンソースマガジンとかいいのかな?
■ このスレッドは過去ログ倉庫に格納されています