C言語なら俺に聞け(入門篇) Part 8
at TECH
468:デフォルトの名無しさん
07/02/28 02:26:54
>>466
「美味しい」じゃなくて「惜しい」だね。
469:466
07/02/28 02:30:30
>>467
???
>>468
お恥ずかしいです
470:デフォルトの名無しさん
07/02/28 02:33:53
>>469
例えば、answer が 10 だとすると、
「惜しい!」ってぇのは何と何だ?
471:デフォルトの名無しさん
07/02/28 02:37:59
>>465
>>>int compare(const void *a, const void *b){
>の const void *bに入れる値はmainの中の何処にあるのでしょうか?
qsort関数の最後の引数としてcompare関数の名前(関数ポインタ)を渡している。
これはqsort関数が配列の要素を比較するときに使う関数。
qsort関数では、aとbに並べ替え対象の配列の要素のいずれかを入れて、渡され
た関数を何度も呼び出す。
>>>*((int *)a);
>は何なのでしょうか?ダブルでポインタのマークがありますが・・・・
int x = *((int*)a)を分けて書くと、
int* a_int = (int*)a;
int x = *a_int;
qsortは、さまざまな型のデータを並べ替えることが出来なければならないの
で、比較関数を呼ぶ際には、比較対象の2データを指すポインタを汎用のvoid*
型で渡すように作られている。
受け取った側ではintの値として比較したいので、まずvoid*型のポインタを
int*型にキャストし、*で値を取り出している。
bsearchも同じような形で比較用の関数を何度も呼ぶ。
>クイックソートのcompare >>qsort(nums, 10, sizeof(int), compare);
>は、const void *a,を指すのでしょうか?
>検索のcompare >>p = (int *) bsearch(&a, nums, 10, sizeof(int), compare);
>は、const void *b,を指すのでしょうか?
意味が分かりません。
472:デフォルトの名無しさん
07/02/28 02:59:52
>>465
>>const void *bに入る値はmainの中の何処にあるのでしょうか?
mainの中には無い。qsortのための比較関数を(関数ポインタ)。
第一引数int x = *((int *)a); が第二引数y = *((int *)b);より
小さい/等しい/大きいの順番で返す値も
0より小さい/等しい/大きい整数を返す。
bsearchも同様。bsearchは配列が整列済みでないと駄目。
>>*((int *)a)
かっこは中から見れば良い。まず、int型のポインタにキャストした。
そしてそのポインタが指してる値を知るには*を付けるということ。
例えば((int *)a)だけだと、int型のポインタにキャストしただけで
要は、それだとaが指してるアドレスを取り出すことになる。
そこで*をつけて、そのアドレスの指し示してる値を取り出す。
473:463
07/02/28 04:13:41
>>471->>472
真にありがとうございます。
凄いとても難しいですね、ちょっとどころか
理解できないようなので出直してきます。。。
ポインタがとかの応用がさっぱりです。
>>int* a_int = (int*)a;
int x = *a_int;
こんなのも参考書には、載っていません
因みに上のソースはその参考書なのですが・・・
474:デフォルトの名無しさん
07/02/28 05:04:58
>>473
ちなみに、malloc()の戻り値もvoid*型だよ
今の規格では、キャストしなくても良い、本来は
int *a = (int *)malloc(100 * sizeof(int));
ってするところint *a =malloc(100 * sizeof(int));でも良いようになってる
(ちなみに上記はint型サイズ100個分のメモリをヒープから借りる)
ま、とりあえずvoid型のポインタを使うときは、malloc()とかでない限り
本来の型にキャストすべし。
ま、勉強していくうちに、そのうちなれるよ。
475:デフォルトの名無しさん
07/02/28 05:10:17
>int x = *((int *)a); /*void型のポインタを、int型ポインタにキャストして、そこにある値を求めます。*/
きっちり説明してあるように見えるのは気のせいか?
476:473
07/02/28 05:19:47
丁寧にありがとうございます。
ひぃ〜難しい、void型のポインタとかを今参考書の索引を漁っていますが
やはり載っていない、キャスト演算やmalkcoのメモリー獲得も
本の解説と照らし合わせてますが、さっぱりなので参考書を買い直し
ここで解説して頂いた事を再度見直してみます。
ありがとうございましたノシ
477:デフォルトの名無しさん
07/02/28 06:06:52
参考書に全て載っていると思うのが間違い。
とは言え、当てにならない参考書だねぇ。
478:デフォルトの名無しさん
07/02/28 10:47:00
List9-9に示した関数をもとにして、文字列を後ろから逆に表示する
("SEC"を受け取ったら"CES"と表示する関数put_rstringを作成せよ。
という問題でオレはこうやったんですが
URLリンク(eggrice.no.land.to)
もうすこしいい方法ないでしょうか?
stdio.hのみでおねがいします。
479:デフォルトの名無しさん
07/02/28 11:21:43
480:デフォルトの名無しさん
07/02/28 11:22:14
void revstr(char *str){
char *endc = str;
char *startc = str;
//終端文字検索
while(endc != '\0')endc++;
endc--;
for(;startc < endc;startc++,endc--){
char tmp = startc;
startc = endc;
endc = tmp;
}
}
481:デフォルトの名無しさん
07/02/28 11:41:24
長い文字列から文字数の分だけ取得したいのですが、
strncpy(cD->cs[nxt].cBmp ,
//現在読み込んでいるポインタ-文字の長さ
readStr + i - txtLen ,
txtLen);
位置(i)も文字数(txtLen)も合っているのに取得できません。
何ででしょうか?教えてください。
482:デフォルトの名無しさん
07/02/28 11:44:51
>>481
こうだろ
文字の長さ-現在読み込んでいるポインタ
483:デフォルトの名無しさん
07/02/28 11:47:06
>>478
#include <stdio.h>
void put_rstring(char *c)
{
int i = 0;
while(*(c + i))
i++;
while(i > 0){
i--;
putchar(*(c + i));
}
}
484:デフォルトの名無しさん
07/02/28 12:04:01
>>480
>>483
ありがとうございます。
添字のカウントの仕方は大体同じなんですね。
485:481
07/02/28 12:07:31
>>482
う〜ん。分からん。
ポインタが先じゃないとおかしいのでは?
他の文字列なら代入できたのですが、cD->cs[nxt].cBmpがおかしいとか?
486:481
07/02/28 12:22:39
サーセン。。。
NULL文字入れるところ
= '\0' じゃなくて == '\0'
やってた。なぜエラー出ないんだ・・・。
情報不足マジですみません。
でも午前中ずっとこれに悩んでたんです。
487:デフォルトの名無しさん
07/02/28 12:24:47
>>485
もうちょいソースくらはい。
488:デフォルトの名無しさん
07/02/28 12:28:23
>>486
その場合、比較演算子として真:1 偽:0のどちらかを返す。
エラーは出ません。
最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5386日前に更新/130 KB
担当:undef