C統合・質問スレッド

このエントリーをはてなブックマークに追加
934デフォルトの名無しさん:2008/06/21(土) 07:32:05
>>931
1. mallocの戻り値は void* 型なので str の型である char* 型にキャストしている
Cでは void* 型からのキャストは自動的に行われるのでキャストしなくてもエラーにはならない。
C++ではないとエラーになるがC++では new を使うのが一般的。
2. >>932の通り
3.式の先頭にある * はポインタ。式の途中にある * は乗算の演算子。
配列への格納は str[ i ] = 'a' のようにするがこれをポインタを使って*(str + i) = 'a' と書くことも出来る。
935931:2008/06/21(土) 12:56:54
>>933
>>934
ありがとうございます。書かれたレス本にメモってがんばります。
936デフォルトの名無しさん:2008/06/26(木) 07:23:59
int main(int argc,char **argv)
ってmain関数があるんですが、これは標準入力で入れられた配列の文字列の個数(int argc)とその配列の先頭のアドレス(**argv)が引数ってことですか?
**argvと*argv[]は同じことなんでしょうか
937デフォルトの名無しさん:2008/06/26(木) 07:41:34
>>936
標準入力で入れられた配列じゃなくて、起動時に与えられたコマンドライン引数の配列の
要素数(argc)と先頭要素へのポインタ(argv)

>**argvと*argv[]は同じことなんでしょうか
int main(int argc, char **argv) {...

int main(int argc, char *argv[]) {...
が同じかという質問なら、同じ
関数引数の宣言では、配列を宣言してもポインタを宣言したのと同じことになる
938デフォルトの名無しさん:2008/06/26(木) 07:44:09
>>937
ありがとうございます
939デフォルトの名無しさん:2008/07/05(土) 12:33:27
構造体の初期化についてなんですが

struct papa{
int number; int mama_number;
}

struct papa menber[5000];

for(i=0;i<5000;i++){
menber[i]={i,i};
}
とはできないんですか?
940デフォルトの名無しさん:2008/07/05(土) 15:20:55
C99ならできた気もするけど、C89ではできない
初期化と代入は別のもの
941デフォルトの名無しさん:2008/07/06(日) 09:28:45
ありがとうございます。
ということは一個ずつ代入を書いていくしかないんですか?
942デフォルトの名無しさん:2008/07/06(日) 10:39:51
そういうこと
もちろん、こういう代入が複数箇所で必要なら関数にまとめることはできる
943デフォルトの名無しさん:2008/07/07(月) 14:41:05
>>939
C++なら(構文は違うけど)できるよ。
944939:2008/07/07(月) 22:36:47
ありがとうございました。
C++スレで聞きます。
945デフォルトの名無しさん:2008/07/08(火) 23:03:53
↓こんなプログラムを作りたいのですがどうやってつくったらいいのでしょうか?

挿入元文字列 : パソコン
挿入文字列 : デスクトップ  ←scanfで任意に入力
       ̄ ̄ ̄ ̄ ̄ ̄ ̄
挿入位置 : 2 ←scanfで任意に入力

挿入結果 : パソデスクトップコン

配列を駆使して作りたいです、教えてください

たぶん多重ループを用いると思うんですが
946デフォルトの名無しさん:2008/07/08(火) 23:23:58
そこまでロジックを書き出せてるなら、もうその通りに書くだけだよがんばれ
947デフォルトの名無しさん:2008/07/08(火) 23:23:58
もっと文字列処理が簡単な言語を使うのがいいと思うよ。
948質問です。(1/2):2008/07/10(木) 10:37:06
質問です。標準入力からgzipにデータを渡し、標準出力から圧縮/解凍データを得ようと思っていますが、
パイプ通信が上手く行きません。一体どうやったら上手く行くでしょうか?環境はLinux+gccです。

int pid;
int pipe_pc[2];
int pipe_cp[2];
int size;

pipe(pipe_pc);
pipe(pipe_cp);

pid = fork();
if(pid > 0)
{
close(pipe_pc[0]);
close(pipe_cp[1]);

size = write(pipe_pc[1],src,src_size);
*p_comp_size = read(pipe_cp[0],comp,100);

fprintf(stderr,"[%d / %d]\n",*p_comp_size,src_size);

sleep(10);
exit(1);
}
949質問です。(2/2)ソース続き:2008/07/10(木) 10:39:15
else
{
close(pipe_pc[1]);
close(pipe_cp[0]);
dup2(pipe_pc[0],0);
dup2(pipe_cp[1],1);
close(pipe_pc[0]);
close(pipe_cp[1]);

execl("gzip","gzip","-f",NULL);

sleep(10);
exit(1);
}

なお、参考にしたページは以下の通りです。御指導宜しくお願いします
http://www.ncad.co.jp/~komata/c-kouza3.htm
http://www.linux.or.jp/JM/html/GNU_gzip/man1/gzip.1.html
950質問です。:2008/07/10(木) 11:05:08
>>949
execl("gzip","gzip","-f",NULL);

execl("/bin/gzip","gzip","-f",NULL);
と絶対パスでないと実行されないことが分かりましたが、
それでも標準入力(read関数で送ったもの)が読み込まれていない様子です。
何が悪いんでしょうか??
951質問です。:2008/07/10(木) 11:24:13
>>950
訂正:read関数で送ったもの→write関数で送ったもの
952デフォルトの名無しさん:2008/07/10(木) 12:12:59
>>951
なんでいきなりgzipなんて難しいものに挑戦するかな。
取り敢えず、cat -nかteeでも動かしてみればいいじゃん。
後者なら、標準入力を標準出力に流すときにファイルにも落としてくれるからデバッグが楽になるよ。
953質問です。:2008/07/10(木) 13:09:35
>>952
本来の目的はバッファデータを圧縮・解凍して、バッファに受け取ることです。
ただし即時性が求められるのでファイルに一度書き出さずに行いたいのです。
アーカイバの標準入力へ渡し、標準出力で受け取ることがしたいのですが、
どうしても上手く行きません。。。
どなたか似たようなことをやったことのある人いないでしょうか?
954デフォルトの名無しさん:2008/07/10(木) 13:54:35
>>952
あのさぁ、いきなりgzipで本番プログラムを作らなければいけないって掟でもあるの?
まずはcat -nかteeで実験してみて巧くいったらgzipを試せばいいじゃん。

それはさておき、圧縮に即時性を云々する段階で何かおかしいと気づくべきだって気もするが。
なんでzlib使わないんだろ。
955質問です。:2008/07/10(木) 20:55:48
解答どうもありがとうございます,zlibなんていう便利なものがあったのですね.
簡単にできてしまいました;^^)
どうもあろがとうございました
956デフォルトの名無しさん:2008/07/11(金) 08:12:42
配列に関数の戻り値を入れようとして

hairetu[2]={f(5),f(3)};
とやってもコンパイルできません。
なにかいい方法はありますか?
957956:2008/07/11(金) 08:26:09
すいません。
グローバルで初期化していたためできないだけでしTA
958デフォルトの名無しさん:2008/07/11(金) 12:36:18
>>956
最近のCはこんなことも出来るのか
959デフォルトの名無しさん:2008/07/18(金) 13:07:58
質問です。

typedef struct{
int year;
int month;
int day;
}Tdate;

int check(Tdate *);



下のint check(Tdate *); は関数のプロトタイプ宣言なんですが、これは何を引数にしているんですか?
Tdate構造体タグのポインタを引数にしているのでしょうか?
960デフォルトの名無しさん:2008/07/18(金) 13:28:44
Tdateへのポインタを引数にしている
Tdateはタグの無い構造体ね
961デフォルトの名無しさん:2008/07/18(金) 14:17:35
では、関数を呼び出す時は
check(&Tdate)
としてTdateのアドレスを渡せばいいんですか?
962デフォルトの名無しさん:2008/07/18(金) 14:23:48
Tdateは値じゃなくて型だからポインタは取れない
例えばTdate型の変数xがあるなら、
check(&x)
みたいに呼び出す
963デフォルトの名無しさん:2008/07/18(金) 14:26:06
int check(Tdate *); 

このプロトタイプ宣言は、いつからOKになったの?
C99?
964デフォルトの名無しさん:2008/07/18(金) 14:28:02
C89だろ
965963:2008/07/18(金) 14:42:13
typedefを見落としてた・・・orz
ワスレテクレ
966デフォルトの名無しさん:2008/07/18(金) 14:45:13
>>962
ありがとうございます
967デフォルトの名無しさん:2008/08/04(月) 22:55:00
質問です

int型(void型以外)の関数がreturn無しで抜けた場合に、スタック領域をぶっ壊す可能性は有るのでしょうか?

こんな関数
int hoge()
{



}
return無しで呼び出し元に戻る

968デフォルトの名無しさん:2008/08/04(月) 23:19:41
通常、壊れません。
969デフォルトの名無しさん:2008/08/05(火) 11:59:19
だからと言って、やっていいわけではない。
970デフォルトの名無しさん:2008/08/05(火) 22:30:31
ソースファイルhoge1.c内でグローバル変数 char g_hoge[64]を定義、
ソースファイルhoge2.c内でグローバル変数 char g_hoge[128]を定義、
hoge1.cには関数 int hoge1()が、hoge2.cには関数int hoge2()が定義されていて
それぞれの関数内で各変数のサイズ分フルにデータをぶち込んでいるとした上で

meinからhoge1()、hoge2()の順に呼び出した場合のグローバル変数g_hogeの扱い(アドレス管理等)って
どうなっているのでしょうか?

今確認出来ている事象としてhoge2()内でmemsetでゼロクリアすると落ちたり、
hoge1、hoge2を抜けたあとで関係の無い関数を呼び出した瞬間に落ちたりしています。
gdbでそれぞれの関数内でg_hogeのアドレスを見ると同じアドレスを指しています


頭の悪そうなコーディングと御思いでしょうが、4,5年商用で稼動しているモノだけにヘタに対処できないんですorz
関数3つ程追加した途端に時限爆弾が作動したみたいです
971デフォルトの名無しさん:2008/08/06(水) 01:04:06
hoge
972デフォルトの名無しさん:2008/08/06(水) 01:47:55
今日、この関数がエントリポイントになってて、
呼び出し側は複数のモジュールのエントリポイントのリストを見に行って
勝手に呼び出すようになっているという説明を受けた。

こういうプログラム書いたことある人いますか?
もっともエントリポイントも初めて聞く言葉だったんで
よくわかってないですが。
973デフォルトの名無しさん:2008/08/06(水) 02:03:59
>>972
特定のI/Fを持った関数を、ある関数群のエントリポイントと呼ぶ。
その関数を呼び出し元が適宜呼ぶから、その先は勝手に作れって話じゃないかと。
974デフォルトの名無しさん:2008/08/06(水) 02:14:55
言い方を変えると関数のポインタを使って云々ってこと?
975デフォルトの名無しさん:2008/08/06(水) 03:49:30
>>973 、4
レスありがと。

関数ポインタは使ってなかったね。
モジュール名とIDがかかれてたが、具体的にどう実装されているのか
Cをシンプルにしか使ってこなかったオレにはさっぱりでした。

win プログラミングでdll 作るときなどでエントリーポイントつくるようで
調べてみたけど同じようなものなのかなぁ。
もっと深いところを追わないとダメだということだけはわかったけど。
976デフォルトの名無しさん:2008/08/07(木) 09:07:49
>>970
>ソースファイルhoge1.c内でグローバル変数 char g_hoge[64]を定義、
>ソースファイルhoge2.c内でグローバル変数 char g_hoge[128]を定義、
言語仕様所上はこの時点で挙動が未定義

gccだとエラーにしないで同じオブジェクトを参照させるみたいだな
そのオブジェクトがchar[64]なのかchar[128]なのかは
リンク後のファイルにobjdump -tすれば分かるはず
977デフォルトの名無しさん:2008/08/07(木) 19:44:31
3次元空間上にある2つの単位ベクトルAとBがあります.
BはZ軸方向単位ベクトルです.

B→AまたはA→Bに回転して一致する回転角度を求めたいのですが
この際にX軸方向,Y軸方向,Z軸方向回転角度として求めたいです.

atan2を使うと,ある軸成分が0の場合には発散したり,回転してないことになってしまいます.
これを回避して組むにはどうすれば良いでしょうか?
978デフォルトの名無しさん:2008/08/07(木) 21:31:18
>>977
ややスレチな気がするがAベクトルをBベクトルに一致させる回転行列がほしいって事か?
979デフォルトの名無しさん:2008/08/07(木) 21:59:03
>>978
すれ違いな気もしますがそのとおりです.

オイラー角だとAとBが一致している場合挫折しちゃったので・・・・
数学板にいくと実装の話しまで行かないし・・・
980デフォルトの名無しさん:2008/08/07(木) 22:04:34
まあ、オイラー角使うなってこった。

回転軸のベクトルと回転角(か、クオータニオン)で指定する方が無難。
981デフォルトの名無しさん:2008/08/08(金) 09:55:51
AとBの外積を求める(→回転軸)

AとBの内積から角度を求める(→回転角度)

回転軸まわりに回転角度だけ回転



回転軸まわりに回転角度だけ回転するような変換行列があればそれだけのことなんでしょうか?
982デフォルトの名無しさん:2008/08/08(金) 18:15:49
983デフォルトの名無しさん
>>981
そう。
ただ、そのやり方でも A == B の時は結果狂う。
A == B の時は条件分岐で単位行列にしとけ。

回転軸を (x, y, z)、回転角を a として、
(cos a, x sin a, y sin a, z sin a) の形でデータを持つのがクオータニオン。