>>931 1. mallocの戻り値は void* 型なので str の型である char* 型にキャストしている
Cでは void* 型からのキャストは自動的に行われるのでキャストしなくてもエラーにはならない。
C++ではないとエラーになるがC++では new を使うのが一般的。
2.
>>932の通り
3.式の先頭にある * はポインタ。式の途中にある * は乗算の演算子。
配列への格納は str[ i ] = 'a' のようにするがこれをポインタを使って*(str + i) = 'a' と書くことも出来る。
935 :
931:2008/06/21(土) 12:56:54
int main(int argc,char **argv)
ってmain関数があるんですが、これは標準入力で入れられた配列の文字列の個数(int argc)とその配列の先頭のアドレス(**argv)が引数ってことですか?
**argvと*argv[]は同じことなんでしょうか
>>936 標準入力で入れられた配列じゃなくて、起動時に与えられたコマンドライン引数の配列の
要素数(argc)と先頭要素へのポインタ(argv)
>**argvと*argv[]は同じことなんでしょうか
int main(int argc, char **argv) {...
と
int main(int argc, char *argv[]) {...
が同じかという質問なら、同じ
関数引数の宣言では、配列を宣言してもポインタを宣言したのと同じことになる
構造体の初期化についてなんですが
struct papa{
int number; int mama_number;
}
struct papa menber[5000];
for(i=0;i<5000;i++){
menber[i]={i,i};
}
とはできないんですか?
C99ならできた気もするけど、C89ではできない
初期化と代入は別のもの
ありがとうございます。
ということは一個ずつ代入を書いていくしかないんですか?
そういうこと
もちろん、こういう代入が複数箇所で必要なら関数にまとめることはできる
>>939 C++なら(構文は違うけど)できるよ。
944 :
939:2008/07/07(月) 22:36:47
ありがとうございました。
C++スレで聞きます。
945 :
デフォルトの名無しさん:2008/07/08(火) 23:03:53
↓こんなプログラムを作りたいのですがどうやってつくったらいいのでしょうか?
挿入元文字列 : パソコン
挿入文字列 : デスクトップ ←scanfで任意に入力
 ̄ ̄ ̄ ̄ ̄ ̄ ̄
挿入位置 : 2 ←scanfで任意に入力
 ̄
挿入結果 : パソデスクトップコン
配列を駆使して作りたいです、教えてください
たぶん多重ループを用いると思うんですが
そこまでロジックを書き出せてるなら、もうその通りに書くだけだよがんばれ
もっと文字列処理が簡単な言語を使うのがいいと思うよ。
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
>>949の
execl("gzip","gzip","-f",NULL);
は
execl("/bin/gzip","gzip","-f",NULL);
と絶対パスでないと実行されないことが分かりましたが、
それでも標準入力(read関数で送ったもの)が読み込まれていない様子です。
何が悪いんでしょうか??
>>950 訂正:read関数で送ったもの→write関数で送ったもの
>>951 なんでいきなりgzipなんて難しいものに挑戦するかな。
取り敢えず、cat -nかteeでも動かしてみればいいじゃん。
後者なら、標準入力を標準出力に流すときにファイルにも落としてくれるからデバッグが楽になるよ。
>>952 本来の目的はバッファデータを圧縮・解凍して、バッファに受け取ることです。
ただし即時性が求められるのでファイルに一度書き出さずに行いたいのです。
アーカイバの標準入力へ渡し、標準出力で受け取ることがしたいのですが、
どうしても上手く行きません。。。
どなたか似たようなことをやったことのある人いないでしょうか?
>>952 あのさぁ、いきなりgzipで本番プログラムを作らなければいけないって掟でもあるの?
まずはcat -nかteeで実験してみて巧くいったらgzipを試せばいいじゃん。
それはさておき、圧縮に即時性を云々する段階で何かおかしいと気づくべきだって気もするが。
なんでzlib使わないんだろ。
解答どうもありがとうございます,zlibなんていう便利なものがあったのですね.
簡単にできてしまいました;^^)
どうもあろがとうございました
配列に関数の戻り値を入れようとして
hairetu[2]={f(5),f(3)};
とやってもコンパイルできません。
なにかいい方法はありますか?
957 :
956:2008/07/11(金) 08:26:09
すいません。
グローバルで初期化していたためできないだけでしTA
質問です。
typedef struct{
int year;
int month;
int day;
}Tdate;
int check(Tdate *);
下のint check(Tdate *); は関数のプロトタイプ宣言なんですが、これは何を引数にしているんですか?
Tdate構造体タグのポインタを引数にしているのでしょうか?
Tdateへのポインタを引数にしている
Tdateはタグの無い構造体ね
では、関数を呼び出す時は
check(&Tdate)
としてTdateのアドレスを渡せばいいんですか?
Tdateは値じゃなくて型だからポインタは取れない
例えばTdate型の変数xがあるなら、
check(&x)
みたいに呼び出す
int check(Tdate *);
このプロトタイプ宣言は、いつからOKになったの?
C99?
C89だろ
965 :
963:2008/07/18(金) 14:42:13
typedefを見落としてた・・・orz
ワスレテクレ
質問です
int型(void型以外)の関数がreturn無しで抜けた場合に、スタック領域をぶっ壊す可能性は有るのでしょうか?
こんな関数
int hoge()
{
:
略
:
}
return無しで呼び出し元に戻る
通常、壊れません。
だからと言って、やっていいわけではない。
ソースファイル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 特定のI/Fを持った関数を、ある関数群のエントリポイントと呼ぶ。
その関数を呼び出し元が適宜呼ぶから、その先は勝手に作れって話じゃないかと。
言い方を変えると関数のポインタを使って云々ってこと?
>>973 、4
レスありがと。
関数ポインタは使ってなかったね。
モジュール名とIDがかかれてたが、具体的にどう実装されているのか
Cをシンプルにしか使ってこなかったオレにはさっぱりでした。
win プログラミングでdll 作るときなどでエントリーポイントつくるようで
調べてみたけど同じようなものなのかなぁ。
もっと深いところを追わないとダメだということだけはわかったけど。
>>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の場合には発散したり,回転してないことになってしまいます.
これを回避して組むにはどうすれば良いでしょうか?
>>977 ややスレチな気がするがAベクトルをBベクトルに一致させる回転行列がほしいって事か?
979 :
デフォルトの名無しさん:2008/08/07(木) 21:59:03
>>978 すれ違いな気もしますがそのとおりです.
オイラー角だとAとBが一致している場合挫折しちゃったので・・・・
数学板にいくと実装の話しまで行かないし・・・
まあ、オイラー角使うなってこった。
回転軸のベクトルと回転角(か、クオータニオン)で指定する方が無難。
981 :
デフォルトの名無しさん:2008/08/08(金) 09:55:51
AとBの外積を求める(→回転軸)
↓
AとBの内積から角度を求める(→回転角度)
↓
回転軸まわりに回転角度だけ回転
回転軸まわりに回転角度だけ回転するような変換行列があればそれだけのことなんでしょうか?
982 :
デフォルトの名無しさん:2008/08/08(金) 18:15:49
>>981 そう。
ただ、そのやり方でも A == B の時は結果狂う。
A == B の時は条件分岐で単位行列にしとけ。
回転軸を (x, y, z)、回転角を a として、
(cos a, x sin a, y sin a, z sin a) の形でデータを持つのがクオータニオン。