1 :
デフォルトの名無しさん :
2005/09/26(月) 21:23:57
2 :
デフォルトの名無しさん :2005/09/26(月) 21:24:42
2 get
3getsなら漏れは神
4ならscanfに%d指定で文字列を読み込ませる
5 :
デフォルトの名無しさん :2005/09/26(月) 22:25:28
5ならビットシフトのコピペもう貼らない
6なら屁こいてもAA貼っちゃう
7なら斉藤またんきがこのスレを征服
8なら漏れは斎藤またんき
9 :
セェンロン ◆89nOjCFiLI :2005/09/27(火) 10:40:34
11 :
デフォルトの名無しさん :2005/09/27(火) 14:19:34
ageとく
13 :
デフォルトの名無しさん :2005/09/27(火) 14:31:06
プリプロセッサで質問です。 #define ABC 10 void main(void){ printf("%"ABC"s\n", "hoge"); } 上記が安易に printf("%10s\n", "hoge"); になるのかと思いきや 違うんですね。 #define ABC 10 #define to_str(s) #s void main(void){ printf("%"to_str(ABC)"s\n", "hoge"); } などとしても printf("%10s\n", "hoge"); にはならないんですね。 どうしたら良いのでしょうか。どなたか良い案を教えていただければさいわいでございます。
>>13 #define ABC "10"
こうする。
15 :
デフォルトの名無しさん :2005/09/27(火) 14:35:20
>>14 ありがとうございます。
すみません、それじゃ駄目なんです。別に数値としても使いたいので。
atoi()すればいいじゃんとかそういうのは無しで、あくまでも
#define ABC 10
というマクロでやりたいです。
>>13 こうすればいい。
#include <stdio.h>
#define ABC 10
#define to_str(s) to_str_main(s)
#define to_str_main(s) #s
int main(void) {
printf("%"to_str(ABC)"s\n", "hoge");
return 0;
}
>>16 おお、すばらしい。めちゃくちゃ感謝です。ありがとうございます。
一旦マクロに渡して展開させてから処理するということですね。
ありがとうございました。
18 :
デフォルトの名無しさん :2005/09/27(火) 14:46:22
>>15 "to_str(ABC)"を " to_str (ABC) "に変えてもダメ?
20 :
17 :2005/09/27(火) 14:54:29
>>19 ありがとうございます。
11.17 にあったのですね。すみませんでした。
ちなみにprintfの桁数を揃えたいだけなら #define MAX 3 printf("%-*.*s\n", MAX, MAX, "hoge"); printf("%*s\n", MAX, "hoge"); という方法もあったりする。上と下の違いは実行してみればわかる
22 :
セェンロン ◆89nOjCFiLI :2005/09/27(火) 15:30:24
>>10 誘導ありがとうございます。
オーナー描画とサブクラス化で検索してみます。
チートぢゃないですw
今までsprintf使ってやってたよ 便利な方法があるんだな
>>21 上の方は冗長じゃないか?
printf("%-.*s\n", MAX, "hoge");でいい希ガス
25 :
ハム ◆S.PtdgMO6E :2005/09/27(火) 17:26:32
C言語の演算子の優先度とその解釈について教えてください。 int a=0; int b=1; printf("%d\n",a=b++); b=1; //初期化 a=0; //初期化 printf("%d\n",a=++b); b=1; a=0; printf("%d\n",a=(b++)); 上記のプログラムを実行すると、 1 2 1 ←ここがおかしい? ここで、a=(b++) の a は 2 になると思うのですが、なぜ、()よ り=が優先されて出力結果が1になるのでしょうか? ()が最優先じゃないのでしょうか? a=(b++)は、bをインクリメントしたその値をaに格納するのでは? なぜそうではないのでしょうか? おねがいします。
bの値を返し、そのあと1増加
C-FAQの3.2辺り?
b++ と ++b の違いくらい、本に載ってないの?
後置インクリメント演算子は増加する前の値を返し、そのあと値を増加させます。
ちなみに優先順位という考えでは a=b++ も a=(b++) も同じ インクリメント/デクリメント演算子は代入演算子より優先順位が高い
31 :
デフォルトの名無しさん :2005/09/27(火) 17:50:15
後置++の副作用は式の実行後って解釈でOK?
32 :
ハム ◆S.PtdgMO6E :2005/09/27(火) 17:53:50
皆さんありがとうございます。 ということは、 *p++ *++p *(p++) (*p)++ これもそれに該当しますか?
>>32 p にアドレス X が入ってるとする。
*p++ X にある値を返し、p を1つ進める
*++p p を1つ進め、X + 1 にある値を返す
*(p++) *p++ に同じ
(*p)++ X にある値を返し、X にある値を1つ進める
>>33 副作用 = 式の値を求める以外の処理。
即ち、出力、再代入等、状態の変化を伴う処理。
int a = 0; printf("%d%d%d", a++, a++, a++); こういうのが210って出力されるのはなんで?
>>35 それは偶然後ろから評価されたから。
この場合の動作は未定義。処理系によるから
やっちゃだめ。
37 :
35 :2005/09/27(火) 20:31:13 0
そうだったのか。 しかし、C言語って未定義とか不定とか多いのなんとかならんのか。
・コンパイラの作成に制限がかかりすぎて面倒 ・不必要な制限は最適化に不利に働く
>>35 BCCでは210
GCCでは210
VC++ Toolkitでは000
でした
>>37 別に未定義なことをしなければいいので無問題。
未定義や不定なことをやるコードにろくなコードはない。
Java未定義や不定を排除したから遅いとか、デマを流してみるテスト
Dならちゃんと定義してそうだがな
45 :
sage :2005/09/27(火) 22:51:03
C言語で、 + - * と / % とで分類する際、 (2つの数字で演算する際、0が使えるかどうかの違い) グループ名をそれぞれつけろと言われました。 決まったようなグループ名があるように言われたのですが、本やサイトで調べても分かりませんでした。 分かる方おりましたらよろしくお願いします。
教えてくれませんでした・・・
たぶん、まじめに講義に出てる奴だけわかる俺定義。
何かオナニー先生が悦に入るために出した問題っぽいなぁ。
そんな分類名聞いたこと無いな もう放置しとけ、俺定義を持ち出すような奴にろくな奴いない
そうっすね、ありがとうございます。 俺定義なんですね・・・
ビットマップの画像データを入れた二次元配列を90度、180度、270度に傾けて表示するにはどうしたらいいのでしょうか。 int **angleBmp(int **iArr2,, unsigned long int y, unsigned long int x){ for(int i=0; i<y; i++){ for(int j=0; j<x; j++){ iArr2[i][j] = iArr2[j][y-i-1]; } } return iArr2; } 過去ログもみて試しているのですが、90度で表示するため二次元配列を並べ替えるのだと思うのですが、 うまくいきません。新しく配列を作ってコピーした方がいいのでしょうか? 的はずれなソースかも知れませんがご教授ください。
新しく画像を確保した方が早い。 そもそも、回転後の画像は高さと幅が変わるし。
>>25 ポストインクリメント演算子は、式の評価が全部終了した時点で適用される。
副作用完了点でぐぐるとよい。
56 :
デフォルトの名無しさん :2005/09/28(水) 00:24:48
main内に char a[10][10]; を作成し 外部関数をfuncを作成しておきます。 このfuncにa[10][10]の先頭アドレス(a)を渡したいのですが、 引数設定を func( char * arr)として、mainから func(a) と渡そうとすると、 'char ( *)[10]' 型は 'char' 型に変換できない(関数 main() ) パラメータ 'arr' は char 型として定義されているので char ( *)[10] は渡せない(関数 main() ) などとエラーを吐きます。 無論char a[10]などの文字列用変数の場合、func(a)と渡しても問題ないのですが。 配列の配列として宣言し、その先頭アドレスを渡そうとするとエラーが出てしまいます。 どうすればよろしいでしょうか
57 :
53 :2005/09/28(水) 00:29:12
ビットマップを読み込んで加工せよという課題なんで、画像データを入れた配列を使わなくてはいけないんです。 二次元配列は画像のサイズを利用してmallocで作ったのですが、この二次元配列をコピーするための同じ要素数の 二次元配列はどう作ったらよいのでしょうか。コピー元と同じやり方で作るしかないのかと悩んでいます。
>>56 void func( char (*param)[10] );
>>56 func(char **arr);
a[10][10]の場合、aは要素数10の配列先頭へのポインタが10個並んだ配列の先頭へのポインタ
>>57 スレ違い。
後、処理を考える前に画像フォーマットの調査位しろ。
>>59 それはポインタへのポインタ型を渡すときだろ。
>>61 すまん、思いっきり間違った・・・
寝てくる('A`)
>>58 ありがとうございます。
mainからfunc(param); (param[10][10])と渡した場合funcは、
char型配列へのポインタを渡さなければいけないのですね。。
>>57 同じやり方で作ったらなにか問題があるのか?
66 :
57 :2005/09/28(水) 00:54:17
>>63 >>64 どうもです。
特に問題があるというわけでなく、無駄な処理が増えると思ったもので。
いつも冗長なソースになりがちなんで少しでもスマートにしなくてはと気をつけながらやっているのですが。
test
68 :
デフォルトの名無しさん :2005/09/28(水) 17:00:09
mallocで1.5GBくらいを作業領域として確保して、100MBくらいの計算結果を ファイルに出力するPROG1と、その100MBのデータファイルを読み込んで、 1.8GBくらいの作業領域をmallocで確保して、別のデータを作成するPROG2を 合体して一つのPROG3にしました。合体の理由は、100MBのファイル読み書きで 時間が掛かるからです。 合体の方法は、具体的には、1.5GBをmallocして作業して100MBのデータが出来たら、 1.5GBの領域はFreeして、次に、1.8GBをmallocして、その領域を新たな作業領域として 使いながら、先ほどの100MBのデータを処理します。 ところが、PROG3を実行していると、1.8GBのmallocで失敗します。 一回目に1.5GB確保して100MBの計算が終わったら、Freeしていますが、 Windowsタスクマネージャでメモリ使用量を見ていてもFreeしているにもかかわらず、 この時点で、このプロセスは1.5GBくらいメモリを使っています。 Free実行した直後に、メモリ使用量は、急には減らないものなんでしょうか?
ヒント:ページング
1.8G を malloc するのに 100M はファイル経由なのね・・
71 :
デフォルトの名無しさん :2005/09/28(水) 17:06:36
>70 >1.8G を malloc するのに 100M はファイル経由なのね・・ メモリ経由です。ファイルの入出力は止めましたので。
>>68 だからメモリクリーナーのようなジョークソフトがあるんだよ
>>68 何Gメモリを積んでるか知らないが、プログラムを纏めたことにより
連続した1.8GBのメモリ確保が出来なくなったんだろう。
最初の1.5Gのmallocを次の1.8GBと統一してみれば上手くいくかもしれない。
あと、freeしたメモリはOSに返されるとは限らない。
ま、どっちにしろまともなOSならプロセスが終了したらメモリは解放されるな。
74 :
デフォルトの名無しさん :2005/09/28(水) 17:42:45
まあ、GlobalAllocの出番だな
75 :
デフォルトの名無しさん :2005/09/28(水) 17:54:40
scanfで関数を取得できますか?
こ こ で エ ス パ ー 登 場 ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
77 :
デフォルトの名無しさん :2005/09/28(水) 18:08:27
>>68 Win32ならHeapAlloc(), VirtualAlloc()またはファイルマッピングを使え
GlobalAlloc使って解放し忘れたら悲惨だなw
sbrk
83 :
デフォルトの名無しさん :2005/09/28(水) 18:46:55
84 :
デフォルトの名無しさん :2005/09/28(水) 18:47:10
配列に格納した数字を昇順に並べ替えるにはどうしたらいいんですか?
そもそもwin32はスレ違いだろ。
>>84 配列の要素(数字)を比較して、自分で昇順になるように並べ替えてください。
あと、学校の課題なら宿題スレに行け。
なんかBCCでコンパイルしようとしたら Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland source.cpp: 致命的エラー F1004 source.cpp 8: コンパイラ内部のエラー(関数 main(int,char * *) ) 致命的エラー F1004 source.cpp 8: コンパイラ内部のエラー(関数 main(int,char * *) ) とか出たんだけどなにこれ?
>>84 #include<stdio.h>
int main{
int a[]={1,2,3,4,5,6,7,8,9,10};
printf("既に昇順です\n");
return 0;
}
94 :
デフォルトの名無しさん :2005/09/28(水) 20:25:34
>>84 #include <stdio.h>
#include <stdlib.h>
/* 比較用 */
int compare_int_ascending(const int *a, const int *b)
{
return *a - *b;
}
int main()
{
int array[] = { ... }; /* データ */
int count = sizeof(data)/sizeof(int);/* 要素数 */
int i;
/* ソート */
qsort(array, count, sizeof(int), (int (*)(const void*, const void*))compare_int_ascending);
for (i = 0; i < 10; i++) {
printf("%3d", array[i]);
}
printf("\n");
return 0;
}
(多重)連結リストに格納されているデータをソートする場合、 地道〜に鈍足ソートするしかないんでしょうか?
>>96 要素数がわかっているなら、配列につめ直してソートする手もある
後は、ヒープソートを使うと良いかな
cgiやphpにみられるような掲示板やアプロダってC言語で作れるのでしょうか。 C言語を学んでいるのですがPHPを使って掲示板を作ろうと考えています、 でもC言語でそのようなものを作れるのであれば、勉強がてらC言語でつくろうかなとも考えているので。 宜しくお願いします。
>>98 自宅サーバなど自分で管理しているサーバなら確実にできる。
そうでなくともサーバでCのコンパイルができればCで書けなくもないが、
そんなことができるサーバなんて普通ありえない。
いちおうCGIをCで書けない事もないがな
できるけど敢えてやるほどの事でもないような気がしないでもない phpの勉強にもなるから、そっちでやったらどうか?
>>102 インターネットに繋がっていて外部に公開するサーバに得体の知れない外部から実行可能なバイナリを放置するなど
通常の思考が出来る管理者では絶対に許さない
そこでコンパイルできなくても外部からバイナリもってくれば同じなのにな
>>103 今まで使ってきたいくつかのプロバイダは
Cが使えたけど、通常の思考じゃ無いと?
>>97 ありがとうございます。
早速やってみます。
110 :
デフォルトの名無しさん :2005/09/29(木) 00:32:45
xreaなんかはコンパイル用のシェルまで提供してくれてるけどな 第一、権限をちゃんと設定してればバイナリ置かれても支障無いだろ 置かれて困るようなのは、その辺の設定ができないヘタレ管理者
前にビットマップのことで質問した者ですが、画像の角度を変えあるなどは出来たのですが、 ヘッダー情報を構造体で宣言しビットマップを読み込む関数で使って値をいれ、 ビットマップを作成する関数に引数として構造体を参照渡しで使いたい時はどう記述すればいいのでしょうか。 bmpHead bmpHead1; readBmp(bmpName, &bmpHead1); //BMP読み込み writeBmp(bmpName2, bmpHead1.biHeight, bmpHead1.biWidth, iArr); //BMP作成 のように引数として構造体のメンバを記入しなくてはいけないのでしょうか。 これでうまく渡せなかったものでして。
115 :
セェンロン ◆89nOjCFiLI :2005/09/29(木) 01:31:29
現状
ファイプロのhtml化ツール(チートじゃねぇってw)
※某所のがなかなかリターンズにバージョンアップしないので、自分で作ることにした。
●リストビューみたいなのは、Microsoft FlexGrid Control 5.0ってやつらしい
ActiveXコントロールを挿入してClassWizardでやるみたい。
しかし、ヘッダーが無いって言われたり、基本クラスのCDialogが無いって入れたり、全てのソースをクラス化しなくちゃいけないくさいので挫折。
●リストビューで我慢することにした
http://www.kumei.ne.jp/c_lang/sdk/sdk_69.htm しかし、猫のを見てやるとタブコントロールが表示されないし、フォントが馬鹿デカクなるし、バグだらけなので挫折。
●タブコントロールでググって出た別の方法でやってみることにした
http://home.a03.itscom.net/tsuzu/programing/tips28.htm ここの方法でやると、タブコントロールの下にリストビューが行っちゃって、マウスで触れなくなるので挫折。
何故か表示だけはリストビューが上。意味分からん。
●現在、DirectXで製作中。
他に手段があるなら、そっちがいい。
タブコントロールの上にリストビューってのは、不可能なんですかねぇ。。
>>115 そんなのHTML生成してIEコンポーネントで表示で良いじゃねえか
>>112 > 引数として構造体のメンバを記入しなくてはいけないのでしょうか。
そういう仕様の関数なら、そういうふうに書けばいいんじゃないか?
> これでうまく渡せなかったものでして。
うまく渡せないっていう意味がわからない。
おそらく受け取りの関数が間違っているのかエラーはでないのですが、各メンバの値を調べると空で、 参照渡しで受け取ったものではなく、初期の構造体として値が無い状態になっていると思われるのですが、 きちんと説明が出来なくて推定になってしまいます。 メンバをひとつひとつ記述して渡すとソースが長くなってしまうので、簡略化する方法が無いかと思いましたので。
>>118 ソースが長くなるから簡略化するとか、そんなこと考える前に
まずは構造体や関数の引数についてちゃんと勉強した方がいいんじゃないの?
120 :
118 :2005/09/29(木) 02:16:16
>>119 そうですね。本やネットで調べても解りずらいところがあり、実際にいろんな人に聞いたほうが
いろんなやり方があるのかと思い相談しました。
レスありがとうです。
>>118 ?何を言ってるのか全然意味がわからんので、脳内補完でレスしとく。
自作関数で参照渡しなら、どちらも構造体のポインタを引数にすればいいだけの話でしょ?
bmpHead bmpHead1;
readBmp(bmpName1, &bmpHead1);
writeBmp(bmpName2, &bmpHead1);
もし、readBmpでうまく読み込めていないという話なら、
単にその関数の処理が失敗してるor間違ってるだけかと。
ファイル読み込みに失敗したとか、ヘッダ構成が実ファイルと合ってないとか、ね・・・。
122 :
98 :2005/09/29(木) 10:41:19
>>99 >>100 >>101 レスどうも。
phpで作ってみることにします、そのほうがもし仮に行き詰ったときにサポートがきくし、他者に聞ける気がするんで。
long a, b, c; a = 0xf9384d42; b = a / 0x18; c = a % 0x18; なぜかこの計算結果が、b = 0xffb7ade3, c = 0xfffffffa になってしまいます。どこがまずいのでしょうか?
自己解決。 unsignedにしたら出来ました。 スレ汚し失礼しました。
>>95 ×:for (i = 0; i < 10; i++) {
○:for (i = 0; i < count; i++) {
あと、何で"%3d"なんだ?2桁の数値しか考慮してないとか...
1, 23, 45, 67, 89 と 12, 345 , 567890の区別が付かないぞ
# 関数名がダサイのは一応目をつむっておこう
それは降順だとか未定義動作が含まれてるとか
># 関数名がダサイのは一応目をつむっておこう と書きつつも、スルー出来なかったんだなw
>>126 その2つなら「区別」はつくだろう。
3桁以上だと前の数字とくっついてしまうから、そういった区別以前の問題。
130 :
デフォルトの名無しさん :2005/09/29(木) 17:40:06
>>129 違うだろ、データを書き換えた時にデータ数を変更してもforの終了条件を変えなくてすむ事が重要なんだろ
区別がつくつかないの問題じゃない
ああああああああああああああああああああああああああああああああああああああああああああああああああ もうプログラム氏ね
とりあえず課題がどーしてもわからないから相談したい #include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]){ int getYYYY=atoi(argv[1]); int yy; int getYYYY(char *s){ if(strlen(s)==4){ else return -1; } if(isdigit(s[0])&& isdigit(s[1])&& isdigit(s[2])&& isdigit(s[3])&&){ yy=atoi(s); if(yy>=1970 && yy<=2005) return yy; else return -1; }else return -1; } printf("%d\n",getYYYY(argv[1])); } まぁ明らかに違うのがわかるんだけども、直せない・・・。 どなたか教えていただきたい
(゚Д゚;)
>132 それまずコンパイルできないだろ
>>132 君のその非常に柔軟な考え方はLispでは実現できるかも知れないが、
糞仕様のCでは(C++/Javaにも当てはまるが)関数内で関数の定義はできないんだ
あと、何がしたいのかを言わずに不完全なソースを出されても
何もアドバイスが出来ない。
>>132 まず、どんな課題かわからない訳だが…(w
それと、丸投げなら宿題スレでやってね。
138 :
デフォルトの名無しさん :2005/09/29(木) 18:45:06
C言語で、ある値の非整数乗、要はx^y (yは非整数)の計算ってどうしたらいいんですか? ググっところ、complex.hを導入すればできるってのは分かったのですが、導入の仕方がきれいさっぱり分かりません。 なお、今のコンパイラはborland c++ 5.5.1です。
139 :
138 :2005/09/29(木) 18:56:22
質問が変でした。 #include <complex.h>とし、 doubleの値でcpowd(x,y)としてもエラーがでます
そうなんですか
powでいいんじゃないの?
142 :
138 :2005/09/29(木) 19:12:44
事故解決しました。 どう見ても精子です。 本当にありがとうございました
皆さんコンパイルするときのコマンドは何使ってます? cl cc gcc bcc
144 :
デフォルトの名無しさん :2005/09/29(木) 19:44:22
for (i=0; str[i] != '\0'; i++); この文をぬけた後str[i]の中の値は?
>>144 0じゃまいか?つーかそれぐらい後ろにprintf追加すりゃ分かるだろ
147 :
デフォルトの名無しさん :2005/09/29(木) 19:49:29
なぜ0になるのじゃ?おしえてくれー よくわからん
148 :
デフォルトの名無しさん :2005/09/29(木) 19:52:29
str[i]!='\0'が偽の場やいあとのi++は評価されるのれすか?
149 :
デフォルトの名無しさん :2005/09/29(木) 20:07:30
>>145 '\0' == 0 と決め打ちしていいんだろうか?
150 :
デフォルトの名無しさん :2005/09/29(木) 20:09:40
そうだす'\0'==0ではないのですが なぜ中身が\0になるのかがわからないのです for文のしくみがよくわからんのです
>>149-150 K&R第二版p47
>'\0'はある式が文字型であることを強調するのに0の代わりに使われることが多いが、その数値は単に0である
bcc
153 :
デフォルトの名無しさん :2005/09/29(木) 20:14:08
for文の動きを詳しくおしえてもらえませんか?
>>149-150 '\0'は8進法で文字コードを指定するエスケープシーケンス。
これが0と等しくなるのは当然だろう。
>>153 for (e1_opt; e2_opt; e3_opt) {
...1
continue;
...2
}
は
e1_opt;
while (e2_opt) {
...1
e3_opt;
continue;
...2
}
と同じ
じゃないや e1_opt; while (e2_opt) { ...1 {e3_opt; continue;} ...2 e3_opt; } と同じ forのe2_optが空のときは1を入れれば同じになる
157 :
149 :2005/09/29(木) 20:26:22
>>157 まぁ俺は'\0'って打ってるけどな
こっちの方がより直感的に分かるから
何が入っているか分からない文字列変数から ある文字または文字列を削除する方法を教えてください。 お願いします。
160 :
159 :2005/09/29(木) 21:11:55
だめだ。全然具体的じゃなかった。。。 何が入っているか分からない文字列というのは ファイルから読み込んだ文字列で、 削除する文字とは例えば改行文字'\n'などの事でつ。 小出しすみません。
先頭から一文字ずつ見ていって、ある文字または文字列以外なら出力先文字列にコピー。
>>159 strstrとmemmove辺りで削除は出来そうだな。
追加はいろいろ面倒だけど
164 :
159 :2005/09/29(木) 21:25:50
>162-163 ありがとうございます。 概ね分かりました
だからそういう馬鹿なレスで乙に入りたけりゃ初心者系に逝ってろよ。
#include<stdio.h> #include<stdlib.h> int yy; int getYYYY(char *s){ if(strlen(s)==4){ else return -1; } if(isdigit(s[0])&& isdigit(s[1])&& isdigit(s[2])&& isdigit(s[3])&&){ yy=atoi(s); if(yy>=1970 && yy<=2005) return yy; else return -1; }else return -1; } int main(int argc,char *argv[]){ int getYYYYValue=getYYYY((char*)atoi(argv[1])); printf("%d\n",getYYYYValue); } 132が意図した処理は上記のコードだと推定した。 もちろんまともに動かないが、文句は132に言ってくれ。
>>165 前スレの自演馬鹿キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
何だろうな なんとなくやりたそうな事は解らなくも無いが何を出力にしたいかがわからん
ヤダ /;:;:;:;:;:;l ミ ,. ヘ. i;:;:;:;:;:;:;l ミ , ´ ̄ ̄` <} |:;:;:;:;:;:;:| ミ / K`! |;:;:;:;:;:;:;| ミ . ヤダ / \ \j |ハト、 fく:;___;:;|_ /,二≧ l. |\ \ ヽ! Kノ ___ ___ ノ: : : : : ::丁:ト、 . /, イ i. ト、 \\ ヽ V j.〉_ ,ノ: : : ::レ_´:: ̄ ヽ: : :―−:、: ::/:./: : ヽ // / ..| l | \ ,> ヾミ「_ ∨\ ̄` <二ヽ: :  ̄: ヽ: \: : : : : :ヾー': : : : : i ヤダ l/ | | i | ヽ._|_ ヽ ,.ィi;うiY] |;:;:;:〉,. --、 ヽ\: : : : :ヽ: :\: : : : ::}: : : i: : : | ヽヽヽヽヽヽヽヽ | | | |,.イ N ,__ ゞー" |l. |IK - 、__.ヽ } ト、: : : : }:_:}: : : : j: : ::ノ: : : |― -- .. _ _/N ヽ.l !;yfご}! , /|. |:|;:;| \  ̄{ |:::|:. : : : : : : : : :.: :' :::/: : : :/;:;:;:;:;:;:;:;:;:;:;:;:;:;:; ̄ ノー一'゙ ヽ. |ト、 ト、`'゙ <> // /j仁.r '  ̄`ヽ. ヽ. }:::|:.: :. : : : : : : : :/:::/: : ::イ;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:; //二.ユ _ ∨ jノ r`ー -r''7 / /  ̄ ヽ.∨::/: : : : : : : : : : : イ: : : : :厂 ̄  ̄  ̄  ̄  ̄  ̄ . 〈 , -/ ,/ 仁. { { |. / / /` ー―――'´ ̄ヽ-'´ ̄´ . \_{ | / ∠{ [.r冖-- L._ヽ j/ _,∠. ____r '´ ジタバタ \__{ ∨ ` ー-、 ヽ- '´  ̄\_ 、 ト、ヽ,ヾ> 〜 }.|||| !」 ヽ.!_| ヽ!
>>165 「乙に入る」とか書いてるお前のレスが一番馬鹿な件
171 :
デフォルトの名無しさん :2005/09/29(木) 23:38:27
下記のようなテキストファイルから 一行づつ、文字列データとして変数に取り込みたいと思います。 とりこみ変数は、2次元配列 char data[i][j]; で iを行数jが一行の文字数みたいな感じを、格納したいです。 if ((fp = fopen("data.txt", "r")) == NULL) { printf("file open error!!\n"); exit(1); } ファイルオープンすることまでは分かりましたが 以下の処理が分かりません。 よろしくお願いします。 data.txt 41 ,43 ,47 ,50 ,62 ,51 ,39 ,70 ,47 ,,,,,,,,, 42 ,49 ,49 ,53 ,70 ,61 ,49 ,34 ,55 ,36 ,53 ,49 ,,,,,, 59 ,41 ,46 ,70 ,64 ,51 ,42 ,46 ,49 ,49 ,,,,,,,
よろしくお願いしますって、あんた何様?
スレ違い様か。
>>167 マタカー━━━━━━(゚∀゚)━━━━━━ !!!!!
>>171 まず最初に、日本語がおかしい上に説明が意味不明。
もう少し落ち着いてやりたいことをまとめてくれ。
あと、ついでに下の質問にも答えてくれ。
1) 読み込むファイルデータはCSV形式と考えてよい?
2) dataの各要素には何が入るの?文字?数値?
a)文字: '4', '1', ',', '4', '3' ... (data[i]は文字列"41, 43, ..."となる)
b)数値: 41, 43, 47, ... (data[i]は数値の配列となる)
3) dataのサイズ(行、文字数)は固定?
→data[MAX_ROW][MAX_COLUMN]として、
行がMAX_ROWを超えたり、行のデータの個数がMAX_COLUMNを超えた場合は
残りを切り捨てていいのか?
すれ違いだっつーに。
178 :
171 :2005/09/30(金) 06:40:14
>>172 宿題ではないのですが・・・。
>>176 レスありがとう御座います。
やりたいとこは、テキストファイルから一行づつの文字列を作りたいです。
作成された文字列を使って、後から行ごとに数値化したいと思っています。
1)CSVでOKです。ただ、文字列として取り込みたいです。
2)文字として取り込みたいです。
3)MAX_ROWをデータの行数より十分に大きくしてすべて取り込めるようにしたいです。
>>178 宿題じゃなくても丸投げは宿題スレへ。
さもなくば初心者スレにでもどうぞ。
180 :
デフォルトの名無しさん :2005/09/30(金) 10:56:01
>>178 文字のままやりたいのならCでなくPerlやawkでやった方が楽だぞ
まず、Cでなきゃいけない理由が知りたい
181 :
デフォルトの名無しさん :2005/09/30(金) 11:08:55
javadocのC言語版ってありませんか?
182 :
デフォルトの名無しさん :2005/09/30(金) 11:13:46
>181 doxygen
仮に、 TEST, ギコ, マ板, 1234 ってのがあったとしたら char sz_fr[ 256 ], sz_fr2[ 256 ], sz_job[ 4 ][ 256 ]; char *token; int tcnt; while ( fgets(sz_fr, 256, fp) != NULL ) { strcpy(sz_fr2, sz_fr); token = strtok(sz_fr2, " ,\t\n"); tcnt = 0; memset(sz_job, 0, sizeof(c8)*4*256); while ( token != NULL ) { sprintf(sz_job[ tcnt ], "%s", token); tcnt++; if ( tcnt >= 4 ) { printf("ERR\n"); return 1; } token = strtok(NULL, " ,\t\n"); } } で最終的に、sz_jobに入る。 この処理って頻繁に使うんだけど、もっと良い方法があったらわしも知りたい。
>>185 strtok()を使うにしても汚いコードだな。
strtok()はスレッドセーフではないし、sscanf()推奨。
>>185 汚いなあ。だけじゃなくて、ロジック的にも変だろう…
って、テストしてないだろ、ほんとに駄目じゃん。初心者スレ逝け。
>>187 pfintf("頻繁に使うって書いてあるから、テストはしてると思うヨ。\n");
pfintf pfintf pfintf pfintf pfintf pfintf pfintf pfintf
↑pufs()使えよ
>>188 ,191 大莫迦鬱
4つ目 sz_job[3] を格納した後どうなるかだけでも追ってみろ。
193 :
187 :2005/09/30(金) 17:17:50
念為。いちおう sz_job[n][0] == '\0' が sentinel って解釈はあるな。 ってひどい例と実装に違いはないと思うが。
size_t型はint型とは違うらしいですが str = (char *)malloc(GetFileSize(hFile , NULL) + 1); NULL文字の確保に+1が必要なんですが、このコード間違ってます?
sz_job[ 3 ]を格納した後、sz_jobを使って1行ごとの何かしら処理をします。
何かしらの部分が、例題ということで省略しました。
1行ごとに処理していくプログラムとして書いたのですが、見れば分かると思って省略した部分が失敗だったようで。
肝心なとこが抜けていて申し訳ないです。
どういう風に書いたら綺麗になりますか?
>>191 自演じゃねーし。
198 :
187 :2005/09/30(金) 18:43:27
>>196 で、省略はともかく sz_job[3]を格納した後 ERRになると。
どのみち設問自体カスなんでおとなしく初心者スレで。糞コテ終了。
199 :
171 :2005/09/30(金) 18:46:37
>>179 すみません、スレ間違えたみたいですね。
誘導ありがとう御座いました。
>>198 あぁなるほど、if文の場所がおかしかったんですね。
どうもありがとうございます。
そこの頭の弱いお2人!そう貴方達ですよ! もっと喧嘩してくれよ。おもんない。
質問です。 浮動小数点の計算でGMPを使っているのですが、 浮動小数点データ型mpf_tの中に、 初期値としてdouble以上の値を代入するには どうすればいいのでしょうか?
もうこのスレいらなくね? 初心者には標準か非標準かという区別が付きっこないんだから。
それは書いてから俺も思った
206 :
202 :2005/09/30(金) 22:00:55
>>203 すみません、完璧に標準Cじゃなかったですね。
スレ違いでしたm(_ _)m
207 :
デフォルトの名無しさん :2005/09/30(金) 23:31:00
itanium2の乗っているマシンでcのプログラムをつくっています。 gccでコンパイルしているのですが、 warningが出てコンパイルができません。 以下のようなエラーです。 warning: cast to pointer from integer of different size 引っかかっている場所は、 double *ini=(double *)malloc(sizeof(double)*1000000); という場所です。配列iniのサイズが小さいうちは以下のように double ini[10000] とすれば、通るのですが、大きなメモリ領域を確保しようと mallocを使うと上のようなエラーが出て、コンパイルできません。 調べてみると、64ビット系で起こるエラーであるということは わかったのですが、回避の仕方がわかりません。 どなたかご存じの方がいらっしゃったらお教えください。 OSはレッドハット8でカーネルは2.4.24です。
>>207 stdlib.hをインクルードしているか?
209 :
デフォルトの名無しさん :2005/10/01(土) 00:47:44
e[N+2][2*N+2] 上記は1次元熱伝導問題を差分法で解くサンプルコードにあった配列なのですが、 どちらがx(位置)で、どちらがt(時間)を表しているのでしょうか? 何故両方ともN+2ではないのでしょうか? (Nは最大分割数)
説明不十分過ぎ 差分法のソースならたぶん簡単だからよく読め
向こうで誘導されて来たんだろ。誘導した香具師もどうかと思うが。
214 :
デフォルトの名無しさん :2005/10/01(土) 03:14:38
IPの後に数は不特定の文字列が入った1行の文字列lineが、スペースを区切りに数行あったとします。 line[NUM] = { "192.168.1.1 abc def", "192.168.1.2 efg", "192.168.1.3 hij klm nopqrs tu" }; こんな感じです。 これのIPと、最初の文字列、最後の文字列を効率的に変数に読み込むにはどのような方法がよいでしょうか? IPと最初の文字列だったら sscanf(line, "%d.%d.%d.%d %s",&IP[0], &IP[1], &IP[2], &IP[3], &name ); という感じでできたのですが、「数が決まってない複数ある文字列の中の最後の文字列」を読み込むいい方法が思いつきません。どなたかアドバイスおねがいします。
>>214 すいません、みすりました。
line[NUM] = {
"192.168.1.1 abc def",
"192.168.1.2 efg",
"192.168.1.3 hij klm nopqrs tu"
};
これは気にしないでください・・・
line = "192.168.1.1 abc def";
だと思ってください。
>>214 危険だがstrtok使うとか、後はstrlenで長さ出して後ろからスペースが出るまで
ポインタ動かしていって、strcpyで切り出し
218 :
214 :2005/10/01(土) 03:37:23
レスありがとうございます。 やっぱりそれしかないですかー。 それでいくことにします、ありがとうございましたー。
strrchr で空白探せばいいんじゃない?
>>214 sscanf(line, "%d.%d.%d.%d.%n",...)で変換完了点を取得、そこからstrrchr()して見つかればそこから。
221 :
デフォルトの名無しさん :2005/10/01(土) 08:21:30
> malloc した後、freeで開放しないでいいの? 最近の PC の OS なら間違いなく main 終了時に自動的にメモリが開放される。 まあ、本当はちゃんと開放した方がいいとは思う。 ここでは、プログラムが長くなるから省略したと好意的に解釈しておく。 開放方法も説明しなくちゃいけないし。 > それと2度目の while の直前で a = b してるけどこれってなんの為にしてるんですか? 色々プログラムを書き換えた時に、消し忘れたんじゃないかな? 他にも色々と洗練されてない。 書き換えるならこんなところか。 int main() { struct list *a, *b; char str[16]; for(b = NULL; ; b = a) { printf("整数を入力(Eで終了)-->"); scanf("%s", str); if(strcmp(str, "E") == 0) break; a = malloc(sizeof(struct list)); a->num_data = atoi(str); a->nextlist = b; } printf("入力された整数は"); for( ; a != NULL; a = a->nextlist) { printf("%d, ", a->num_data); } return 0; }
223 :
221 :2005/10/01(土) 09:50:41
むむ、for文のこの使い方初めて見ました。 最初のは b を NULL で初期化して b = a しつつ無限ループで 次のforは初期化は省略して a != NULL の間 a = a->nextlist しつつループですか! 慣れると面白そうですね。
a を保存しておきたければ printf("入力された整数は"); for(b = a ; b != NULL; b = b->nextlist) { printf("%d, ", b->num_data); } で、開放は while(a != NULL) { b = a->nextlist; free(a); a = b; } か。 void list_free(struct list* a) { if(a == NULL) return; list_free(a->nextlist); free(a); } と再帰してもいいんだが、末尾再帰じゃないからなあ。 物凄く長いリストでスタックオーバーフローするかもしれん。 (コンパイラが末尾再帰最適化(※)に対応してなければ、末尾再帰でも問題になるが) 木構造だと要素数に比して深さは大したことない事が多いけど、リストは一直線だしね。 まあ、あまり長いリストを扱わない前提ならいいと思う。 ※)末尾再帰最適化 再帰をループに直す最適化。最後の最後で再帰(末尾再帰)しないと無理。 return foo() + 2; でも、関数終了後に 2 を足す作業があるので駄目。
225 :
408 :2005/10/01(土) 14:13:33
void list_free(struct list* a) { struct list* n; if(a == NULL) return; n=a->nextlist; free(a); list_free(n); }
226 :
デフォルトの名無しさん :2005/10/01(土) 14:15:18
どーでもいいけど全体を設計してから些末にこだわってくれ。
>>226 そのとおりだね。小手先もボディーブローのように後で効くけど、全体の設計が杜撰だと後で苦労するね。
マジレスw
#includes って知ってる??
知らないなw
231 :
デフォルトの名無しさん :2005/10/02(日) 00:36:04
C言語の出力にgnuplotを使おうと思っているのですが、 MS−DOSプロンプトなどからのコマンドラインで、 gunplot.exeなどのexeファイルを実行するコマンドを教えてください。
system() ?
system()
235 :
231 :2005/10/02(日) 00:38:59
>>233 exeファイルのあるディレクトリに移動して、system()と入力するのでしょうか?
()の中に何か入れるのでしょうか?
少しは自分で調べたらどうか
>>235 お好きなエディタに移動して system(""); と書く
238 :
231 :2005/10/02(日) 00:47:28
>>237 コマンドプロンプト上で実行する命令がしりたいのですが?
cd や ls などのような命令コマンドを教えてください
>>238 system("ls || dir");
とか?
もしかしてUnixのpopenの事を言ってるのか?
>>221 >それと2度目の while の直前で a = b してるけどこれってなんの為にしてるんですか?
>>222 >色々プログラムを書き換えた時に、消し忘れたんじゃないかな?
まず、list型データは線形リストになっている。
aは新規データ操作、リスト全体へのアクセスに使われ、bがデータを保持する。
bは最初NULLを指し、常に最後に取得したデータを指す、
先入れ後出しなデータ構造になっている。
それは理解してるようだが、
a = b; は、aを無駄に初期化せずに次の処理に入る無駄のない処理だ。
その後のループの終了条件はNULLが来ること。
これは、データ件数が0の場合でも、すべてのデータを処理し終えた場合でも
同じ条件でループを抜けることができる効率的な方法だ。
ソースコードでは malloc()に失敗した場合のコードが省かれてるが、
普通はmalloc()に失敗した場合もデータ取得の終了条件になる。
するとaはデータを正しく指さなくなる。
だから確実にデータを保持しているbを代入しなければならない。
データをどの変数が管理するのかをきちんと決めてそれを維持するようにする事が、
錯誤のない、例外が発生しないプログラミングをするために必要だ。
>>243 そんな細かい事考えるの面倒だからC++でtry構文使っちゃダメ?
245 :
231 :2005/10/02(日) 01:19:07
>>242 はい。すみません。UNIXでの実行コマンドを教えてください。
>>243 NULL チェックしてないから不要ジャン。
それを言うなら、普通は malloc で確保する時に使う変数を一時変数にするぜ。
質問の意味がわからないのは俺だけ?
>>222 for(b = NULL; ; b = a) {
これは最初の判定で break; してしまった場合、
aが指すアドレスが不定になってしまう。
そのままで free() なんかするとメモリを壊してしまう。
メモリ破壊をしないためにあえてサンプルでは free() をしてなかったりして。
>>244 C++知らないけど、tryばっかりで深すぎて全体が流れとして見えなかった。
流れで見るのが間違ってるかもしれない。
小規模のしか作ったことないし。
>>246 while (1) {
if (a == NULL)
これは僕ならこう書く
while ( a ) {
250 :
デフォルトの名無しさん :2005/10/02(日) 01:36:41
関数ポインタのポインタをtypedefを使わずにどのように定義したらいいんでしょうか? typedef void(*Func)(); Func* f; のFunc*をtypedefを使わずに定義したいんです。
>>248 俺も分からん
このスレに来てる癖にUnixコマンド聞いてるしな
まぁUnixといってながらMSDOSプロンプトとか言ってる時点でお察しだが
>>249 > これは最初の判定で break; してしまった場合、
> aが指すアドレスが不定になってしまう。
あぁ、そのための b = a; か、って、
a = b = NULL; にすればいいだけか。
間違えた。a = b; だ。
>>250 見た目優先で
Func* f;
と書くのは構わないが、基本的には
Func *f;
だということを頭に入れておく必要がある。
変数名の前に * を入れるとポインタになり、
* を増やすと深くなる。
それを踏まえれば、
void (**f)();
になることは言うまでも無い。
>>245 popenをコンソールアプリで使いたいのだと勝手に考えとくw
DOS環境のpopenならDJGPPのソースから持ってくれば早いんだがそれじゃWindows環境じゃ動か無いな
問題はコンソールをどうやって子プロセスの入出力に対応付けるかだが、
動きそうなのはcygwinのclibのソースから持ってくるって所か?
つーか、コンソールアプリにしてパイプで繋げばいいだけだろ 敢えてCから制御する意味が分からん
258 :
デフォルトの名無しさん :2005/10/02(日) 04:49:21
void foo(int n) { char s[n]; } このコードがgcc 3.3.2で問題なく通るんですが、 なんで配列を定義するときの要素数に変数が使えるんですか? bcc 5.5ではコンパイルエラーになりましたが。
260 :
258 :2005/10/02(日) 05:16:14
環境依存なことをしない限りは、安全のため -ansi -pedantic -Wall でコンパイル。 C99 使いたければ -ansi の代わりに -std=c99 だ。
ポーカーのプログラムを作りたくて 以下のように役の名前を宣言するとクラスメンバーが初期化できないといわれます。 どういうことなんですか? class Poker{ private:const char *pairName[] = { "No Pairs", "One Pair", "Two Pairs", "Three of a Kind", "Straight", "Flush", "Full House", "Four of a Kind", "Straight Flush", "Royal Flush", }; : :
Cなのかそれは。
C++はダメですか?
staticじゃないからだろ
#include <stdio.h> #include <conio.h> int main(void) { int cnt; char m,ch; m='z'; for (cnt=1;cnt<11;cnt++){ ch = getche(); if (m>ch)m=ch; printf("\n\n"); } printf("一番前の文字は%c",m); return 0; } アルファべット順で一番前に来る文字を最後に表示するプログラムを作っているんですが、 独習Cの回答とほとんど同じなのに最後に正しく表示されません。どこがおかしいか教えてください。
「一番前の文字は」のあとに文字が出るはずなんですが、何もでないんです
>>270 どんな文字を入力したか位のことは書くべきだとは思わないもんかねぇ。
まぁ、getche()使っているからスレ違いだな。
>>270 「一番前の文字は」が出てるなら
printf("一番前の文字は%c(%x)です",m,m);
とでもしてやり直せ
%xとは何型で表示するものなんですか?
>>271 アルファベットを入力してます
>>273 man printf
もう来るな、帰れ
275 :
デフォルトの名無しさん :2005/10/02(日) 13:45:12
できました、ありがとうございました。 文字のコードを表示するんですね。
278 :
デフォルトの名無しさん :2005/10/02(日) 13:51:01
八ッキングおせーて
やだよーん☆
>>242 何を見てそう思ったのかよくわからないけど飛躍しすぎだぞ
VS.NETならコードエディタで関数名タイプした時点でMSDNのオフラインドキュメントが辞書引きされて 出てくる
283 :
デフォルトの名無しさん :2005/10/02(日) 15:36:48
>>278 何でもいいからトリッキーなコードを書いてみる遊びに教えるもクソもない
クラックやボランティアと混同しているならそれらとの区別を調べて
自分が興味を持っている分野が世間で何と呼ばれているかを知るといい
そうすれば同好の士が見つけることの能率が上がるだろう
個人的には自己満足のコードを書くだけならいちいち徒党を組む必要はないと考えるが
>>281 だって、出力用にgnuplot使いたいと言ったらcsvとか吐き出してそれをグラフ化したいのかな?って思うのが普通じゃん
popenつかえば中間ファイル作らなくてすむから楽かなと思っただけ
>>278 まずは、ログインしているところを肩ごしに覗き見るところから始めてみたら。
286 :
デフォルトの名無しさん :2005/10/02(日) 20:40:14
288 :
デフォルトの名無しさん :2005/10/02(日) 20:52:28
ほかのスレに書いたんですが、こっちのほうがいいと思い質問です。 以下の問題を配列を必ず使ってプログラミングしてください。 正整数を入力し、それをローマ数字で表示するプログラムを配列を使って作りなさい。 1000がM, 100がC, 10がX, 1がIであるので、たとえば、123と入力するとCXXIII、1365はMCCCXXXXXXIIIIIと出力できればよい。 <入力例> Input: 3247 <出力結果> MMMCCXXXXIIIIIII Cを始めて2週間ですがわかりません。お願いします。
>>288 あほだな、ソースが欲しいならC言語始めるぞスレで課題にしちゃえばいいんだよ
ちなみに普通4→IVとか、9→IXってするけどそれは良いの?
そんなスレあったのか・・・。 4とかはIIIIでいいはず。めんどくさいから5→Vってのすら無いし。
291 :
デフォルトの名無しさん :2005/10/03(月) 00:33:00
stat でファイルのアクセス権を取得したんだがこれをRWX に変換する方法はありませんか?このために関数作るのもな
>>291 >使用している開発環境のスレへGo! (←ここ注目)
293 :
デフォルトの名無しさん :2005/10/03(月) 01:37:33
>>292 さんくす
環境はLinuxなんですがUNIXスレに移動した方がいいってことか。
294 :
デフォルトの名無しさん :2005/10/03(月) 18:01:39
>494<---前スレです! >scanfを暴走させるのはスキル不足 >getsを使うのは知識不足 >strtokでハマルのは理解力不足 >よって、馬鹿はscanf, gets, strtokは使わない方が良い。 9月の話に戻っちゃうけど… scanfは分かります。改行がバッファに残って 悪戯しますよね。 getsやstrtokのどこに不具合があるのか? 教えて下さい。
297 :
デフォルトの名無しさん :2005/10/03(月) 18:24:04
>295 少なくとも、K&Rには書いてない。
少なくとも、K&Rには書いてない。 少なくとも、K&Rには書いてない。 少なくとも、K&Rには書いてない。 少なくとも、K&Rには書いてない。 少なくとも、K&Rには書いてない。 少なくとも、K&Rには書いてない。
最後に_sをつけたら解決 MS信者でよかったね、報われたね
>>297 はK&Rにダメと書かれてなければ全ていいと思ってる馬鹿
302 :
デフォルトの名無しさん :2005/10/03(月) 20:15:31
strcpy((db[i+1]=(char*)malloc(128)),dv_key[2]); これなにやってるかわかりますか? おしえてください。
>>302 dv_key[2]の内容を、新たに割り当てた128バイトの領域にコピーしている
>>302 db[i+1] = (char*)malloc(128);
strcpy(db[i+1], dv_key[2]);
と分ければ分かるかね?
>>302 malloc() に成功するかどうかも分からないのに馬鹿なことするなあ。
strcpy() にしても、何文字コピーするか指定できないのによく使うよなあ。
僕はstrcpyはバイト数も指定してコピーするけど、無駄ですか?
>>305 strncpyならともかく、strcpyじゃコンパイル通らないでしょ。
>>305 その「バイト数」とやらが簡単に変更可能ならOK
おれは、D言語にする。 すばらしきD言語
309 :
デフォルトの名無しさん :2005/10/03(月) 21:52:25
>>303 ありがとうございます!
何をやっているかはわかりました。
そこでもう1つ質問です。そうしてわざわざdb[i+1]=(char*)malloc(128)
としているのですか?db[i+1]だけではだめなのでしょうか?
理由を教えていただけませんか?
>>296 strtokの方のバグには、区切り文字が連続する状況では使えないってのが書いてないな
>>309 mallocはメモリ領域を確保する。
それを行っているということは元のdb[i + 1]は適切なメモリ領域を指しているものでないということだろう。
だからmallocを呼んで領域を割り当てておかないとメモリのどこかわけわからない場所へ書き込もうとすることになる。
>>310 それはバグというよりも仕様では
もっとも連続する区切り文字を一つの区切りとみなしたいケースって
空白文字を区切りとして使う場合ぐらいだけどな
313 :
デフォルトの名無しさん :2005/10/04(火) 00:17:54
電話に電話以上の機能を求める図々しさ・・・トホホ者の天才的資質
ビットマップを拡大・縮小するにはどうしたらいいのでしょうか。 ヘッダーもいじらなきゃいけないのですが、ファイルに書き込むところで。 二次元配列に入れてピクセルデータを1/2縮小なら配列からひとつおきにファイルに書き込んで 2倍拡大なら配列のひとつの値を同じのを2つ連続でファイルに書き込んでいけばいいと思うのですが、 その書き方が解りません。お願いします。 for(i=0; i<biHeight; i++){ for(j=0; j<biWidth; j++){ fwrite(&iArr[i][j], sizeof(unsigned char), 1, fp2); } }
315 :
デフォルトの名無しさん :2005/10/04(火) 00:24:02
316 :
デフォルトの名無しさん :2005/10/04(火) 00:24:39
>>315 >>314 どうもすいません。一応モジュールなどは使わないで配列などの工夫だけで出来るから
と言うことだったのでRGBなど気にしないで、配列の中身を一個おきに取り出す方法などをお聞きしたかったもので。
パズルみたいにひらめきと言われたのですが躓いてしまったもので。
これで満足か? 1/2 for(i=0; i<biHeight; i+=2){ for(j=0; j<biWidth; j+=2){ fwrite(&iArr[i][j], sizeof(unsigned char), 1, fp2); } } 2倍 for(i=0; i<biHeight; i++){ for(j=0; j<biWidth; j++){ fwrite(&iArr[i][j], sizeof(unsigned char), 1, fp2); fwrite(&iArr[i][j], sizeof(unsigned char), 1, fp2); } for(j=0; j<biWidth; j++){ fwrite(&iArr[i][j], sizeof(unsigned char), 1, fp2); fwrite(&iArr[i][j], sizeof(unsigned char), 1, fp2); } }
>>318 どうもありがとうございます。
答えを見てやり方を考えるとこうすれば良かったんだと思うのですが、なかなか自分では
うまく形に出来ないんで。こうすればいいなどの方向は漠然と思いつくのですが、汎用性を持たないなどの
きれいなソースがかけないので、もっと試していくようにします。
ありがとうございました。
320 :
デフォルトの名無しさん :2005/10/04(火) 06:38:09
biHeight ってことは BMP 形式か? 8bit形式は却って難しいぞ ^^
プログラムがしたいんですけど、CとC++ならどちらを勉強した方がいいですか?
>>314 どうして、まずビットマップのファイル形式から調査しないのか、理解に苦しむ。
323 :
デフォルトの名無しさん :2005/10/04(火) 10:47:03
C++
324 :
デフォルトの名無しさん :2005/10/04(火) 10:52:55
>>321 やりたい方
細かい長所短所よりやる気が最重要
ちなみに C と C++ は可能なことと不可能なことが同じだ
>>324 それは流石に言いすぎだろ。
>>321 「プログラムがしたい」が具体的に何をさすのか知らんが、
単にプログラミングを齧ってみたいだけならVBAでもやっとけ。
c++
>>321 コンパイラその他、準備だけはC++のものを用意して、
実際にはC(相当する部分のC++)の勉強をする。
329 :
デフォルトの名無しさん :2005/10/04(火) 12:49:31
>単にプログラミングを齧ってみたいだけなら アセンブラ
330 :
デフォルトの名無しさん :2005/10/04(火) 20:52:32
質問です。 下のプログラムを書いたのですが、思った通りに動きませんでした。 普通にダブルクリックして起動すると、test.txt が作成されるのですが、 他のファイルをドラッグドロップして起動すると、test.txt は作成されませんでした。 何が原因なのでしょうか? #include <stdio.h> int main(int argc, char *argv[]) { FILE *fp; fp = fopen("test.txt", "w"); fputc('a', fp); fclose(fp); return 0; }
他のファイルと同じ所に作成されてるよ。 要はエクスプローラの仕様。 D&Dしたらその引っ張ってきたファイルの方がカレントになる。
ちゃんと作成されてる。 強いて言うならお前がボケなのが原因
>D&Dしたらその引っ張ってきたファイルの方がカレントになる。
>>331 みたいなの漏れのPCではユーザー名のフォルダになぜか作成されてたり
するんですが、それも仕様なのですか?
検索したら、たまに変のフォルダに出来てたりします。
334 :
デフォルトの名無しさん :2005/10/04(火) 21:07:10
スレ違いは死ね
335 :
330 :2005/10/04(火) 21:07:39
プログラムと同じディレクトリのファイルだったのですが 何の音沙汰もなく・・・
環境依存の質問をしているという自覚はないのか?
338 :
デフォルトの名無しさん :2005/10/05(水) 01:11:45
こうですか? 分かりません!
339 :
デフォルトの名無しさん :2005/10/05(水) 02:03:23
どなたか いろんな数nについてn!を計算するプログラム nCr=n!/r!(nーr)!を計算する関数のプログラム 2次方程式 ax2+bx+c=0の解を複素解まで求められるような関数のプログラム 作っていただけませんか??
すまん、数学が分からない
342 :
デフォルトの名無しさん :2005/10/05(水) 02:07:49
C言語でチャットのように双方向で通信をしたい場合は送信用と受信用で二つのスレッド かプロセスを作ったほうがイイのですか?
345 :
342 :2005/10/05(水) 02:22:36
>>330 俺も良く分かんないけど、コマンドライン引数を渡すと環境依存になるのね。
アホかい。
アホなのでうんちしてきます。
349 :
デフォルトの名無しさん :2005/10/05(水) 05:54:10
あ、俺もうんちうんちしてくる
OSはWindowsだろ? ダブルクリックの場合は、その実行ファイルのあるディレクトリがカレントディレクトリになる。 D&Dのばあいはややこしくて、2000/XPの場合 C:\Document and Settings\ユーザー名\ になってたと思う。 ドラッグアンドドロップで直接起動したときのカレントディレクトリがどこになるかって、確かOSにもよると思われ。 実行時のカレントディレクトリを明示してやるには、ショートカットを作って「作業フォルダ」を指定してやる。 D&Dはそのショートカットに対して行う。 これでやってみたら?
>>350 明らかにスレ違いな話題に一々レスすんなや。
352 :
デフォルトの名無しさん :2005/10/05(水) 08:27:29
XPユーザーが一番なのでおkです
御陰様で残尿感が無くなりました。 平穏な日々に戻れそうです。
354 :
デフォルトの名無しさん :2005/10/05(水) 19:41:37
C/C++の宿題を片づけます 51代目 の誘導できました 改めてcの質問をさせていただきます。こぴぺですが許してください char型の入力をするのに scanf()とgetchar() がありますが、それぞれの長所短所って何ですか? 追加です 入力された変数の内部のデータも上の二つでは違うのでしょうか?
356 :
デフォルトの名無しさん :2005/10/05(水) 20:53:07
>>354 char ひとつ入力するのに int だの浮動小数点だの使わない機能が満載の scanf が使いたければ使うがいい
恥ずかしながら初心者です。 私の今使ってるエディタでコンパイルしようとしたら「追加コマンドライン」を入力 する欄があるのですが…コマンドラインで検索したところ「CUI環境で、コマンドを入力する行のこと」だそうで。。 これはいったいどういったものなのでしょうか? お手数をおかけ致しますが教えて頂けませんか?
>エディタでコンパイルしようとしたら 無茶するな。
>>354 scanf
・文字を受け取る変数の型は char 固定
・ファイル終端で scanf の戻り値が 0 で、文字を受け取る変数は変化なし
・"%c" を解析する時間が余計にかかる
getchar
・ファイル終端で EOF が返ってくる
・文字を受け取る変数の型は int
(0〜255 と EOF の 257 種類のデータを返すため)
何を長所や短所と感じるかは、状況次第か。
>>357 スレ違い。
そのエディタのスレ、もしくは環境依存 OK なスレで聞くこと。
>>358 「StarEdit」というフリーソフトなのですが、エディタという分類だったものですから…
全くの初心者で、それ向けのページを見ながらやっているもので。すみません…
>>359 申し訳御座いませんでした、アドバイスありがとうございます。
邪魔をしてしまってすみません、失礼します。
>>359 間違えた。ファイル終端だと scanf は EOF を返すんだった。
363 :
デフォルトの名無しさん :2005/10/06(木) 01:24:42
またひとつ、scanf の悪名が不当につり上げられた ・・・後を絶たない DQN の手によって もっとややこしいオブジェが腐るほどある世界ではこの程度で蹴躓く間抜けが何とも面倒な足手まとい ハマる前に調べるなり聞くなりする「初心者」さんの方がよっぽど筋がいい ただし規格票と処理系のマニュアルはちゃんと手元に置けよ >初心者
364 :
デフォルトの名無しさん :2005/10/06(木) 01:33:39
「不当に」とか言ってるけどscanfは普通に最低の仕様
365 :
デフォルトの名無しさん :2005/10/06(木) 01:39:34
sscanfならOKだけどな。
366 :
デフォルトの名無しさん :2005/10/06(木) 01:41:39
>普通に 説明なく使われる最狂のキーワード
>不当に 説明なく使われる最狂のキーワード
368 :
デフォルトの名無しさん :2005/10/06(木) 01:47:53
高だの低だの言う基準を伏せたまま言った者勝ちの論法は相手にしてられない
初心者だからsscanfを連発するって言ってた人がいたんですけど、どういう意味でしょうか>< 僕みたいなのはstrtokの方がお似合いですか>< わかりません><
好きなほうを選べばいい
>>370 自分を信じることにしました。
どうも有難う御座いました><
"という文字を扱いたいのです。 例えば if(Buf[i]=='"')という感じです しかし、"はC言語ではそのままでは使えないので、\"と、指定しましたが 私のIDEでは'\"'とすると、どうも\"から緑文字になってしまいます。 使用しているIDEはCpadでして、現状ではIDEの問題なのか本当に間違ってるのか分からない状態です。。 "という文字を単独で扱う場合どのように扱えばよろしいでしょうか・・
\"なんだけど・・・ IDEの問題ぽいね
そうですかorz とりあえず0x22と数値を指定しちゃって様子見しますわ・・
375 :
デフォルトの名無しさん :2005/10/06(木) 07:16:26
すまん、数学が分からない
数値分からないにみえた。
'"' は有効だったと思うが・・・。
あるよね、構文ハイライトのバグ。
エディタにコンパイルまでやらせんなって事だろ
ってかこんなこと言われないと気づかない香具師はいないだろさすがに
ってことで
>>357 =
>>381 =釣り
384 :
デフォルトの名無しさん :2005/10/06(木) 12:38:09
エディタからコンパイルは出来ても、エディタでコンパイルはなかなか出来ないよな
まあな・・・リスプをバイトコンパイルする妙なエディタもあるけどな。
386 :
デフォルトの名無しさん :2005/10/06(木) 13:44:06
わからないので教えてください。 2次元の座標の回転の変換のプログラムがわからないので教えて下さい。お願いします。
回転行列
「リスプ」って初めて見た
(詳しい説明)ぐぐればトップにでてくる
豚 クスッ
質問させて下さい。パイプ通信についてお尋ねしたいのですが。 Aというプログラムを作成し、今後作成するBのプログラムからAにアクセスし、 Aの内部変数を変えたりAに指示(ファイル作成命令)を与えたりしたいです。 このBを作成するに当たって何か参考になるサイト様などはありますでしょうか? 別プログラムにアクセスするのはこれが初めてなもので…宜しくお願いします。
>>393 プロセス間通信をまじめにやりたいならOSごとに手法が異なるから該当スレへ。
横着するならこんな感じ。
・プログラムAは、外部から操作したい内容を標準入力で指示できるように作っておく。
・プログラムBは、それをファイルに書き出せるように作っておく。
・その状態でそれぞれのデバッグがすんだら、プログラムBからプログラムAを起動してそのパイプをファイル出力部に適用。
まぁ、環境依存スレあたりでやりたいことをしっかり書くことだね。
396 :
393 :2005/10/06(木) 19:10:57
>>394 お返事と紹介、ありがとうございます。
私の見解が著しく間違っているかも知れないのですが、
こちらはデバッグフリーツールなのでは無いでしょうか?
GDBからAのプログラムへアクセス出来る様ですが、
「Bというプログラムを作成して、あくまでその中でAを操作する」
必要があるのです。読みが足りない場合大変失礼な物言いになるのですが、
Bというプログラムを作成する為の知識、は上記のURLを参考にするべきなのでしょうか?
397 :
393 :2005/10/06(木) 19:13:33
>>395 環境依存スレですね、了解しました。お手数掛けます。
上記の方法も検討させて頂きたいと思います。
>>396 > Bというプログラムを作成する為の知識、は上記のURLを参考にするべきなのでしょうか?
Aの任意の変数を変更したいとか、任意の命令を与えたいと思うなら参考にするべき
特定の変数の変更や特定の命令を与えたいだけなら
>>395 の手でいける
399 :
デフォルトの名無しさん :2005/10/06(木) 20:22:19
>>372 あなたは間違っていない
エディタのバグだのコンパイラの警告だのに
威圧されて妙なクセを植え込まれるな
これを防ぐには色々な処理系をちゃんぽんするのがよい
>>393 の質問にたいして環境非依存のファイル経由の方法を
伝授するのがこのスレの醍醐味ではないのか
AとBはクライアント・サーバじゃねーの
402 :
デフォルトの名無しさん :2005/10/07(金) 21:32:14
質問お願いします。 授業で作ったtest.cをコンパイルしようとして コマンドプロンプトをひらいたのですが bcc32 test.cと打ったら ’bcc’は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 と出てきました。 XPなんですが調べてみてもXPでコンパイルするのはbcc32としか出ませんでした。 馬鹿な質問だとすいませんでした。
>>402 先生に聞いて下さい。馬鹿。
すれ違いですよ。馬鹿。
404 :
デフォルトの名無しさん :2005/10/07(金) 21:48:51
質問したいんですけど!!初心者です…
405 :
デフォルトの名無しさん :2005/10/07(金) 21:59:52
UNIXの環境で、C言語でプログラムしようと考えています。 しかし、それにはGUIが必要なのですが、このUNIXにはないと 言われました。 インストールして、C言語でできるのでしょうか?
関数がファンクションしてるよ
>>403 スレ違いのレスにいちいち煽りつきでレスすんなカス
408 :
デフォルトの名無しさん :2005/10/07(金) 22:06:02
>>404 僕も質問したいんですけど!!初心者です・・・
412 :
デフォルトの名無しさん :2005/10/07(金) 23:59:48
Undefined first referenced symbol in file sqrt review6.o ld: fatal: Symbol referencing errors. No output written to review6.exe って出たんですけど何が悪いんでしょうか?!
>>412 あんたの頭。
あんたの使っている環境のスレを探してそっちに行ってくれ。
414 :
デフォルトの名無しさん :2005/10/08(土) 00:23:54
C言語でフォーム作成ってできるの? フォームはマウスとか操作できるもの。
>>405 > しかし、それにはGUIが必要なのですが、
この前提条件が間違っている。
417 :
デフォルトの名無しさん :2005/10/08(土) 00:37:07
>>415 紛らわしい書き方してごめんなさい。
C言語でフォームなど(ボタンなど)を作成して、マウスで操作できる
ようにしたいのですが、無理ですか?
ちなみにWindowsではないんです;;
>>418 専用スレってどこにあるのかわかんなかったから…
答えてくれてどうもありがとうございました。
>>419 FreeBSDです。
>>417 可能か不可能かという質問に答えると、
手間さえかければソフトウェアで実現できるほぼすべてのことが可能。
UNIX系なら対話式のコマンドラインアプリを作ってTcl/Perl/Ruby + Tkでラップするのが 簡単な気がする。
>>421 でもそれには、専門的な知識が必要なんですよね?
つまりあたしには無理だ…
>>422 調べてみます。ありがとうございます。
UNIXでGUIアプリを作るのは馬鹿 Windowsで作れWindowsで
バカを相手にするな。
427 :
デフォルトの名無しさん :2005/10/08(土) 09:49:57
馬鹿を相手にするのは案外楽しいよ
あまりにアレなので言わせてもらうのだ。 WinとUNIXは使う人が違うのだ。UNIXはキーボードをメインに使うのだ。 キーボードでちゃちゃっとやっちゃうのだ。むしろGUIはかえって無駄なのだ。 UNIXが使いたいなら、そっちも急須と思うのだ。 以上、UNIX触れたことすらないおれちゃんの主張なのだ。 しかし、UNIXで何がしたいのか花々しく謎なのだ。
>花々しく 不覚にもワロタ
すいません。昨日質問したものです。あたしもできれば、Windowsで プログラムを作成したかったのですが、卒研室のパソコンが 先生の好みでUNIXしかないのです… それに絶対Windowsを入れないと言われました。
433 :
デフォルトの名無しさん :2005/10/08(土) 10:50:25
>>432 何でそんなこと言われないといけないわけ?
435 :
デフォルトの名無しさん :2005/10/08(土) 11:27:12
>>434 だからそれ言っていいと思ってんの?
まじありえない。
環境依存の質問はその環境のスレへ行け 日記は日記帳に書いとけ
>>431 過去の事物にしがみついて新しいことを何ひとつ
学ぼうとしない典型的老害の教授だな。
そういう教授は税金の無駄だからさっさとクビに
するべきなんだが、この国ではできないんだよな。
まあ、操作を統一するために、一つの環境にこだわるってのもアリだとは思うがな。
440 :
デフォルトの名無しさん :2005/10/08(土) 15:21:08
単方向リストで、あるデータを、リストの好きなところに入れるように指定して挿入する関数 struct AddressList *insert(struct AddressList *root, struct Address ad, int n); を作りたいのですがうまくいきません。 この関数の宣言はこのままで作りたいのですが・・・・ addr[10]にはデータが入っていることにしてください。 大体以下のような感じでつくったのですがうまくいきません。 リストの先頭にだけうまく入らないようです。 どなたかアドバイスお願いします・・・・
441 :
デフォルトの名無しさん :2005/10/08(土) 15:22:28
int main() { struct AddressList *root;/* rootをNULLに設定 */ struct Address addr[10]; insert( root , addr[1] , 1); insert( root , addr[2] , 0); showList( root ); /* リストを表示する関数 */ return(0); } struct AddressList *insert(struct AddressList *root, struct Address ad, int n){ struct AddressList *current;/* 現在のポインタ位置 */ struct AddressList *new;/* 新ノード */ int i;/* ループカウンタ */ current = root;/* 現在地をルートに設定 */ new = (struct AddressList *)malloc(sizeof(struct AddressList));/* 新しいノードのメモリ確保 */ new->addr = ad; new->next = root; root = new; return(NULL); }
442 :
デフォルトの名無しさん :2005/10/08(土) 15:24:05
すいません、うまく省略しようとして失敗しました・・・ insertの中身はこんなかんじです。 current = root;/* 現在地をルートに設定 */ new = (struct AddressList *)malloc(sizeof(struct AddressList));/* 新しいノードのメモリ確保 */ new->addr = ad; if( n == 0 ){/* リストの先頭に挿入する場合 */ new->next = root; root = new; } else{/* 挿入位置が先頭でない場合 */ for( i=0 ; i<n-1 ; i++){/* リストのn-1番目まで移動 */ if(current->next == NULL)/* 次がNULLならそこで終わり */ break; current = current->next; } new->next = current->next;/* new の next をその時点でのn番目にする */ current->next = new;/* n-1番目のnextをnewに */ }
GUI、スレッド、グラフィック、マルチメディアかな・・・よくある機種依存ネタ。 ファイルフォーマットは、微妙。
>>440 情報が少なくて良く分からんから、適当に作った。
脳内コンパイルなんでうまく動くかは知らん。
struct AddressList *insert(struct AddressList *root,struct Address ad, int n){
struct AddressList**p;
struct AddressList*New;
int i;
p = &root;
New = (struct AddressList*)malloc(sizeof(struct AddressList));
for(i=0;i<n && *p;++i)p = &(*p)->next;
New->addr = ad;
New->next = *p;
*p = New;
return root;
}
447 :
デフォルトの名無しさん :2005/10/08(土) 16:11:28
>>445 む・・・
mainのほうで insert( root , addr[1] , 1); のように、ポインタで宣言されたrootを渡し、
insertで*rootで受け、root = new のようにしてもつなぎかえれないんでしょうか?
insertの方でshowListするとうまくいくんですが、mainに戻ってからshowListするとだめみたいで・・・
ポインタのポインタ使うひつようありですか?
>ポインタのポインタ使うひつようありです 確保したメモリのアドレスを保持させる必要があります。 単にポインタだと一時的に記憶しますが、呼び元で使おうと思うなら 元のポインタ変数に記憶させなければなりませんので...
449 :
445 :2005/10/08(土) 16:19:28
>>447 ポインタのポインタを使わなくても書けないことはないが、
nがゼロの場合に上のコードみたいに分岐するような醜いコードになるから、
普通はポインタのポインタを使う。
あと、insertした後ちゃんとrootの値を変えてるか?
root = insert( root , addr[1] , 1);
こういう風に書いたら多分大丈夫と思うが。
450 :
445 :2005/10/08(土) 16:30:28
もし関数のプロトタイプを変更しても良いのなら、こういう風に書ける。 この場合挿入した後は、適切に値を置き換えるから、 間違いも起こりにくいし、こっちの方が綺麗かな。 どちらにせよ無駄のないコードを書くのならポインタのポインタは必須になります。 void insert(struct AddressList **root,struct Address ad, int n){ struct AddressList*New; int i; for(i = 0 ;i < n && *root; ++i )root = &(*root)->next; New = (struct AddressList*)malloc(sizeof(struct AddressList)); New->addr = ad; New->next = *root; *root = New; }
root(head)は、 ・ポインタだけって方法 ・一個捨て要素を用いる方法 ・付加情報(要素の数とか)をもったコントロールブロック+上記のうちのいずれか っていうパターンに、 headだけでなく、tailも持つとかそんな手法もありだな・・・。
452 :
デフォルトの名無しさん :2005/10/08(土) 17:04:14
色々レスありがとうございます!
自分のではなぜできてなかったはなんとか理解する事ができました!
しかしポインタのポインタを使って解決できるていうのがよくわかりません・・・
>>445 さんのソースコードで、rootのnextをnewにするのに、 *p =New というのがよくわからないのですが・・・
*pというのは結局insert内のrootのアドレスで、insert内のrootがnewに書き換わるだけではないのでしょうか?
453 :
440 :2005/10/08(土) 17:13:19
あ、
>>449 の root = insert( root , addr[1] , 1); て言う風にしたらできました・・・
ありがとうございました!
で、問題は解決したのですが、結局ポインタのポインタは使わず n==0 の時で場合わけして完成しました。
というわけでポインタのポインタを使った方法は理解できてません・・・
結局ポインタのポインタ使う利点はなんだったんでしょうか?
n==0の場合わけが必要なくなるてことでしょうか?
質問です エスケープ文字の\tを機能させずに出力する場合にはどうすればいいのですか?
456 :
440 :2005/10/08(土) 17:22:58
すいません、解決したと思ったのですが・・・ 演習問題をやってたわけですが、問題の条件に、 insertの返り値は、リストの追加された位置を返す、 という条件付でした・・・ というわけで常にrootを返して root = insert というのはだめっぽいです・・・ 関数のプロトタイプはさっきのまま、返り値はリストの追加された位置、という条件ではどのような方法がよいのでしょうか?
printf("\\t"); は可能でしたが printf("\\\"); は無理でした。どうしてですか?
開発環境がARM SDTだったソースをgccでコンパイルしたいと思っています。 パッケを拾って、makefileを書いて、makeしました。 以下のエラーが出ました。 - エラーメッセージ - error: stray '$' in program error: stray '$' in program error: syntax error before 'RW' error: stray '$' in program error: stray '$' in program - 発生個所 - extern u32 Image$$RW$$Limit; この変数の$$RW$$の意味がわかりません。 マクロのような置き換えができるのでしょうか? googleで'$'を探せないので調べられませんでした。 どなたか意味・対策など教えてください。
>>458 シェル(sh)は何使ってるかわかる?
makefileくらいさらしちゃえば?
>>459 return New;
にするとrootの手前に挿入するときに問題発生するんだよなぁ。
rootの手前が新しいrootになっても元のrootは書き換わらないから。
絶対になにか根本的に重要な事実が伏せられている気がする。
(たとえばrootはダミーで要素を入れるのはrootの次以降とか)
よくわからんが、$も識別子として使えるコンパイラと使えないコンパイラの差じゃなかろーか。>458
464 :
440 :2005/10/08(土) 17:50:49
>>462 あ、すいません、誤解を招いたかもしれません・・・
実際に指定されているのは関数のプロトタイプだけで後は僕が勝手に書いたものです・・・
先頭からn番目に新たな要素adを追加して、追加された位置を返り値とする関数、てな感じです。
465 :
458 :2005/10/08(土) 18:03:04
bash以外csh、tcsh、kshなどでやっても同じエラー出るのかな?
>>458 識別子に $ が使われてるだけなんだが。
>>458 環境依存だけど、その環境のスレってのはどこになるんだろ・・・。
それの分かる人がいなければ、ここで話すしかないのかね。
おそらくは、そのコンパイラ特有の拡張仕様かと思われ。
ARM SDT RW で検索したら、何か英語の質問フォーラムで
それを使ってるようなものがあったりするけど、
関係ないのも含まれてると思うけど、
それらをしらみつぶしに見ていくしかないのかね。
ざっと見た感じでは、RAM の終端アドレスを示す識別子のようだけど・・・。
>>458 検索も能力のうちだぞ。
-fdollars-in-identifiers
471 :
デフォルトの名無しさん :2005/10/08(土) 18:52:52
>>470 何言ってんの?
とりあえずたらいまわしですか?
場違いな人間の逆切れ
場違いな人間の粘着
>>469 解決しました。
みなさんありがとうございます。
これからも精進します。
>>470 分からないからって…市役所の方ですか?
カルシウム足りてる?
騙りにも気付いてない人が何を言ってるのかって、 もしかして自演?
ここまで俺の自演
>>481 キミの場合はカルシウムではなく学習能力がアレだね
>>481 ×カルシウム
○乳酸菌
正確には「乳酸菌とってるぅ?」だ
>正確には「乳酸菌とってるぅ?」だ 日本語勉強して来いってw
アレで済ませてるとボケるぞ
_ ,'´r==ミ、 ,_ _ _ 卯,iリノ)))〉 _ _ _ <乳酸菌とってるぅ? / `."-|l〉l.゚ ー゚ノl/ ヽ '"'⌒`~"'" ''|!/'i)卯i |ゝ '''"ー"`` ノ~U ̄Uヽ )__ _( | 乳酸菌| |  ̄ ̄ ̄|
_ ,'´r==ミ、 ,_ _ _ 卯,iリノ)))〉 _ _ _ <聖徳太子知ってるぅ? / `."-|l〉l.゚ ー゚ノl/ ヽ '"'⌒`~"'" ''|!/'i)卯i |ゝ '''"ー"`` ノ~U ̄Uヽ )__ _( | 乳酸菌| |  ̄ ̄ ̄|
乳酸菌のとこは一万円とすべきだったな
>>498 当 た り 前 で し ょ そ ん な こ と !!!
502 :
デフォルトの名無しさん :2005/10/09(日) 00:23:29
はじめまして、突然ですが以下のプログラムが完成しません。 仕様は変更せずにこの関数を完成させたいのですが・・・行き詰まってしまいました。 問題点がどこにあるかどなたかご教授頂けないでしょうか? よろしくお願いいたします。
503 :
デフォルトの名無しさん :2005/10/09(日) 00:24:54
//////////////////////////////////////////////////////////////////////////////
//【関数名称】long xsb_change_jtob(char *jis,long keta)
//【処理名称】JISのデータをバイナリコードに変換する
//【機能】桁数回ループし、JISのデータをバイナリコードに変換する
//【引数】変換前のデータ(1byte)、変換後のデータ(2byte)
//【戻値】long型の値
//【備考】なし
//////////////////////////////////////////////////////////////////////////////
long xsb_change_jtob(char *jis,long keta)
{
long i,ans=0;
long return_bin;
for(i=0;i<keta;i++){
ans=jis[i]-0x30;
if(ans<0x40){
return_bin=ans;
}else if(ans>16){
return_bin=ans+16;
}
}
return(return_bin);
}
/*******************************************************************************
*問題点
*○現状では最後にreturn_binに格納された値しか返らない(格桁数毎に戻り値を返したい)
*○JISコード表の3,4,5の列のみを対象としている。
* 0〜9行の場合は正常に変換。A〜F行の場合は変換処理が異常値を返す(変換に失敗している)
*JISコード参照:
http://www.fellow-ship.com/tech/jisebc.html *******************************************************************************/
宿題は宿題スレにて
>>503 >格桁数毎に戻り値を返したい
戻り値ってのは関数から帰ってくるときに持ってくる値な訳で
それを返す=関数から抜ける。よって不可能
他は考えるのが面倒なのでパス
>>503 >格桁数毎に戻り値を返したい
↑のコードは戻り値が単なるlong型の変数なので、返る値は1個だけ。
複数の値を取得したいなら、どうやっても関数の仕様変更が必要
1. 関数の引数に桁番号を追加して、「指定桁の値のみ」を返す関数を作る
2. 関数の引数に出力結果を格納する配列のアドレスを追加する(呼び元でメモリ確保)
3. 出力結果の配列を関数内で生成し、そのアドレスを返す(関数内でメモリ確保 ※後で解放が必要)
>A〜F行の場合は変換処理が異常値を返す
えーと、まず最初にループの中の処理と、期待している結果について説明してくれ。
俺の読解力が低いのか、寝ぼけてるだけなのかわからんが、
何やってるのかいまいち理解できん。
>>502 無理。勘違いもはなはだしい。すでに 505,506の指摘があるが。
他にも、バイナリコードに変換する、ってなによ? まさか A->10, F->16 の
数値に変換したい? 通じにくい言い方だな、はともかく、
例ではそんなロジックにはまったくなってないからなあ……
余談だが、JISコードなどの用語とかも、もっとちゃんと理解しとこうね。
初歩的なことだと思いますが、質問させてください。 10進の整数を、各桁ごとくり上がり無視で加算するにはどうすればよいのでしょう? 例としては、 456 + 789 = 139 となるような式です。 どなたか分かる方いましたら教えて下さい、お願いします。
>>508 テケトーに書いてみた。
456 + 789 = 139 にならんので、もしかすると望んでいるのと違うかも
int add_r(int a,int b,int r,int sum){
if(a|b)return add_r(a/10,b/10,r*10,sum + (a%10+b%10+20)%10u*r);
else return sum;
}
int add(int a,int b){return add_r(a,b,1,0);}
// test
#include<stdio.h>
int main(){
int sum = 0;
int a = 456,b=789;
printf("%d\n",add(a,b));
return 0;
}
>>508 各桁ごとに計算するしかないね。
値を普通の int で保存せずに、
int 配列で各桁ごとに分けて保存しとけば、
それもやりやすいのではないかと。
ただ、それが無理なら、こんな感じにせざるを得ないかと。
/* c = a + b */
for(c = 0, n = 1; a != 0 || b != 0; a /= 10, b /= 10, n *= 10) {
c += (a % 10 + b % 10) % 10 * n;
}
16 進ならもうちょい高速なアルゴリズムも作れるけど。
int xadd(int x, int y) { int r=0,d=1; while (x || y) { r += (x+y)%10*d; x/=10; y/=10; d*=10; } return r; } printf("%d\n", xadd(456, 789)); 俺もこの程度しか思いつかなかった
あぁ、そうだ。a も b も % 10 する必要なかったな。
>>512 a+bがオーバーフローする場合を考慮するなら必要あり。
あー、そうか。
509さん、510さん、511さん、ありがとうございます。 皆さんの答えはどれも非常に参考になりました。 509さんが仰っていた「456 + 789 = 139」とならないとのことですが、 私のレスでの例が間違っておりました;申し訳ないです…。 正しくは「456 + 789 = 135」となりますので、私の望んでいた通りのものです。 また、配列で各桁ごと分けて保存し計算する方法でも解決することができました。 仰る通りに未熟な私でもやりやすかったです。 皆さん、本当にありがとうございました。
516 :
デフォルトの名無しさん :2005/10/09(日) 13:52:03
普通に加算して、1000で割った余りを出すだけじゃないのか?と…
各桁ごとくり上がり無視 途中の桁の繰り上がりをしてないか>516
ホントに寝ぼけてただけなんじゃないの?w
520 :
440 :2005/10/09(日) 20:29:52
昨日の問題解決することができました。
基本
>>441 ,
>>442 のコードで、main の insert( root , addr[1] , 1); の部分を &(*root) として、 main の *root のアドレスを
渡すことによって、 insert の方で root を操作する事ができました。
結局ポインタのポインタ使わずじまいですが・・・
問題は解決したのですが、もしポインタのポインタ使う利点と使い方アドバイスしてもらえればありがたいです。
521 :
440 :2005/10/09(日) 20:32:09
すいません、うそでした・・・ root = insert() の記述がそのままで、結局返り値をnewにしたらだめでした・・・
行の最後にCRLFを書きたいのですが fprintf(fp,"%c,%c",'\r','\n'); のように書いてもうまく出力されないのです。 申し訳ないのですが、CRLFの記述方法を教えていただけないでしょうか。
>>522 バイナリモードで開いているか?
やり方はそれでいいけど、単にfprintf(fp, "\r\n");やfputs("\r\n", fp);でいける。
あるいはWindowsならテキストモードで'\n'を出力すると大抵の処理系ではCRLFを出力する。
>>523 ,524
ありがとうございます!
表示もしっかり出ています。
本当にありがとうございました!
526 :
デフォルトの名無しさん :2005/10/10(月) 03:41:37
標準入力から配列 line に、文字列(スペースを含む、改行は含まない)を入れる最も簡単な方法はなんでしょうか? 例えば This is a pen. のような文章を標準入力をするような場合です。 scanf じゃできませんよね・・・?
strtok
529 :
デフォルトの名無しさん :2005/10/10(月) 03:56:41
>>527 scanf("%s",line);
とすると
This is a pen.
と入力した場合 This しか line に入らないのではないでしょうか・・・?
>>528 標準入力から文字列を得体のですがどのように使えばいいのでしょう?
fgets
何が疑問なんだ? fgetsなり使えばいいじゃん
532 :
526 :2005/10/10(月) 04:23:53
あ、fgetsでファイルポインタのところを stdin とすると標準入力からになるんですね・・・ 失礼しましたー
stdin する。
534 :
デフォルトの名無しさん :2005/10/10(月) 13:42:56
8進数って何がありがたいの? 2進と16進数だけで十分じゃない?
パーミッション指定みたく、3個の要素を持つパラメータに使われてたりする。
>>534 chmod 0x1a4 とかイヤだろw
0777
そんなの0x777でいいと思うんだけど、 昔はそんな余裕がなかったのかな?w
パーミッション指定以外で 8進数って使ってるの見たことない気がするけど ほかにもあります?
512色画像とか。
>>539 資源の節約に躍起になってた頃からある概念だしなぁ。
あと、7以上の値を取ることがないのが基数で保証されてるわけだから、
0x787のような不正な値を即値で指定される心配がないってのも微少なメリットかも
>>540 自分の周りにはあんまりないですねぇ。
RFCのドキュメントに8進数が使われてて、
それを10進か16進数と間違えてバグ出したことがあるね。
そのときくらいかな、8進数を見たのは。
octal ってなんだっけ、と2秒止まったよw
2進数(1bit)と16進数(4bit)は区切りがいいけど、8進数(3bit)は区切りもよくないし、 何がありがたいのかよく分らなかった。逆に4進数(2bit)は区切りとしてはよさそう なのにあんまり聞かないのも不思議というか。 とりあえず、そんなに意味はないってことで納得しました。
8進数は全部数字で書けるってくらいかね。
パーミッションぐらいしか使わない
むしろ、パーミッション以外での利用法が知りたい。
vi で使われてるな
昔は一ワードが16bitのミニコンと呼ばれるコンピュータがあってのう。 先頭の1bitを符号bitとして使って8進5桁で15bit、 計16bit の一ワードの表記が一般的だったのだ
オサーンGJ
551 :
デフォルトの名無しさん :2005/10/10(月) 16:01:20
オナーニAF
AFは16進数
octal、まあC言語とunixにはゆかり深いからなと "PDP-11" "8" でぐぐった
まあ、パーミッションが書きやすいだけでも、存在価値はあるけどね。 それを言うなら2進数もかけるようになってると嬉しいが。
μプロセッサのニモニックも、3ビット単位に構成されているので8進で表記しやすい。 例えばz80のレジスタ間転送は 76543210 01sssddd となるが、これは16進だと40h+s*8+dを計算するしかない。しかし8進なら1sdoとなる。 これならアセンブラの支援なしで簡単にコーディングができる。 #例えばaレジスタは7、bレジスタは0なので、47h=170o=ld b,aとすぐに判る。
8進表現より2進表現の方がよっぽど有用だよなぁ。 何で標準でサポートしないんだろ。 2進表現をサポートしてるコンパイラなんて CodeWarriorぐらいしか知らない。
559 :
デフォルトの名無しさん :2005/10/10(月) 19:50:26
質問です。 \0 と NULL は同じ意味と考えてよいでしょうか? また聞きなんですが、memcpy()の引数に \0 を渡した場合、 コケた?そうです。
じゃぁ、違う意味ってことでFA?
あー・・・ NULL:「何も指していないポインタ」をNULLと書く。 '\0':文字コードゼロ。もしくは、文字列の終端文字。 0:整数のゼロ と使うべきで、memcpy()の引数に'\0'なんて使っちゃいけない。
>>558 C++ではtemplateで無理矢理実装してるが、Cマクロでもできなくもないな。
memcpy()の引数にNULLは使ってもいいんですか?
564 :
デフォルトの名無しさん :2005/10/10(月) 20:11:04
>561 ありがとうございました。勉強になりました。
565 :
デフォルトの名無しさん :2005/10/10(月) 20:12:47
#define HEX_DIGIT_0000 0 #define HEX_DIGIT_0001 1 ... #define HEX_DIGIT_1111 f #define HEX_DIGIT(a) HEX_DIGIT_##a #define BINARY8H(a, b, c, d, e, f, g, h) (0x##a##b##c##d##e##f##g##h) #define BINARY8I(a, b, c, d, e, f, g, h) BINARY8H(a, b, c, d, e, f, g, h) #define BINARY8(a, b, c, d, e, f, g, h) BINARY8I(HEX_DIGIT(a), HEX_DIGIT(b), HEX_DIGIT(c), HEX_DIGIT(d), HEX_DIGIT(e), HEX_DIGIT(f), HEX_DIGIT(g), HEX_DIGIT(h))
>>562 補足。俺の場合の話。C 0xあたりに入れて欲しいよね。
567 :
初心者 :2005/10/10(月) 22:50:44
商品の金額と出した金額を入力し、おつりを算術するプログラムが出来ません。 #include <stdio.h> #include <conio.h> #include <stdio.h> int main (void) { int kai,kane; int oturi = kane - kai; char buf[3]; printf("いくらの買い物ですか\n"); kai = atoi(gets(buf)); printf("お金はいくら出しますか\n"); kane = atoi(gets(buf)); printf("おつりは%d円です\n",oturi); } こんな感じで打ったのですがエラーになります。初心者ゆえなにを如何したら改善するのか皆目検討つきません ちなみにコンパイラはborlandC++compilerです。 どなたかご教授願えますか?
>>567 エラーメッセージを貼れ。
つーか、初心者スレに行け。
570 :
初心者 :2005/10/10(月) 22:55:57
わかりました 初心者スレに行ってみます・・・
つか、エラーは読んだのかと激しく問い詰めたい。
572 :
デフォルトの名無しさん :2005/10/10(月) 23:39:56
とりあえずウィンドウを作りたいんですがコレでやっても 1:宣言の構文エラー 5:宣言の構文エラー と出るのですがどうすれば良いのでしょうか? include "windows.h" LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); int APIENTRY WinMain(HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASS wc; wc.style = (CS_HREDRAW | CS_VREDRAW); wc.lpfnWndProc = (WNDPROC) MainWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); wc.lpszMenuName = NULL; wc.lpszClassName = TEXT("Window Class 1"); if (RegisterClass(&wc) == NULL) return -1; HWND hWnd = CreateWindowEx(WS_EX_APPWINDOW | WS_EX_WINDOWEDGE, wc.lpszClassName, TEXT("ウィンドウsample"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, (HWND) NULL, (HMENU) NULL, hInstance, (LPVOID) NULL);
573 :
デフォルトの名無しさん :2005/10/10(月) 23:40:44
f (hWnd == NULL) return -1; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int) msg.wParam; } LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProc(hWnd, message, wParam, lParam); }
#includeディレクティブに#がねぇ
>>572 >>1 >GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
Windows 系のところに移動した方がいいよ〜。
577 :
C言語始めたばかり :2005/10/11(火) 00:13:29
5個の文字列データを入力された順に配列を使って実現されたリンクドリストに記憶する。 リンクドリストのm番目に文字列を挿入する関数insert、リンクドリストのn番目の文字列データを削除する関数delete、 リンクドリストに記憶されているデータを記憶されている順に出力する関数plistを定義し、 その頭文字I、D、Pの入力によって、入力で指定されたデータをパラメータとして、 それぞれの関数が呼び出されて実行するプログラムを作りたいのですが、どのようにしていけばよいのか全くわかりません。 詳しい方 教えていただけないでしょうか。お願いします。
>>577 まずするべきことはデータ構造に関するサイトを探すか本を買うかして勉強することだと思う
同感。 その辺は理解してちゃんと作っておくと後々役に立つしね。
オススメのサイトありますか?
分量があるので、本がいいかもねぇ・・・。
googleしか使わない奴は信用できない
h消し忘れた(´Д`;
>>583 そんな奴はGoogleも使いこなせないと思う
googleばかり薦めるのもスレのレベルが低く見られて 上級者が散っちゃう原因になるんだけどねぇ
>>586 そうなのか。それは初めて聞いた。悪かったよ。
そんなこと言っても、実際その辺の本よりGoogleの方が 役に立つ
ある程度の知識があってこそGoogleは 役に立つ
Googleでヒットするサイトは俺が書いたんだよ
データ構造について書かれた本またはサイトでオススメはなんですか?
>>591 The art of computer programmingでも読めと
A+D=Pってpascalだったっけ?
んだね。
596 :
デフォルトの名無しさん :2005/10/11(火) 11:56:30
やっぱり、まず初心者はクヌース先生の本を一式読んだほうがいいな
597 :
デフォルトの名無しさん :2005/10/11(火) 14:37:08
ある値aが非数(nan)やinfとなったとき、 if文で検出する方法を教えてください。 たとえば、 double a; if(a==nan) a=0; としてもうまくいきません。
先日, 以下のようなコードを書いたら先輩に注意されてしまいました. if ((pStruct != NULL) && (pStruct->param == VALUE)) { ... } else { ... } なんでも, コンパイラによっては前の判定で偽になっても後の判定を行ってしまうもの があり, 結果として後の判定で NULL ポインタアクセスとなってしまうのだそうです. なので, この場合は初めに NULL チェックだけの if を書き, メンバの判定に if を もう一つネストして書かなければだめだとのことですが, それだとひどく冗長なコード のような気がしますし, else の内容を 2 度書かなければならなくなってしまいます. 私は今まで (といっても 2, 3 年ですが) この書き方で問題になったことがないの ですが, 実は論理式の評価の順番は規定されてはおらず, 今までたまたま助かって いただけなのでしょうか.
>>599 釣りなら適当なスレへ。
そうでないならマニュアルなり入門書をよく読みましょう。
>>599 そんな標準に準拠してないコンパイラは窓から投げ捨てろ。
そのままでいいよ。
>>599 &&や||に限っては評価順が決まっている。
603 :
デフォルトの名無しさん :2005/10/11(火) 15:55:56
ハンドルされていない例外は・・・・・.exeにあります。0xC0000005: Access Violation と表示されるのですがなんなんでしょうか?かなり悩んでます。
範囲外のメモリにアクセスしてるんだろ。 配列のインデックスや無効なポインタをチェックしれ
knuthの本に書いてあることぐらい、数学ちゃんとやっておけば 自分で思いつくようになる。あの本買うぐらいなら数学やるべし。
数学とクヌースならクヌースのほうが安く済むよ
C言語ってみんな何歳くらいからやり始めたん?
>>607 スレの浪費にしかならないアンケートして何が楽しいんだ?
17才 PC9801購入をきっかけに乗り換え それまではMSXでBASIC
27才 プラットフォーム(hp9000)の変更をきっかけに乗り換え それまではpdp11でpascal
ここはしょせんム板の雑談スレだろw
参考までにいいんじゃね? 他の話題が挙がってる訳でも無いし。 ーーーーーーーチラシーーーーーーー いつの事だったか、ヒッキーの小学生プログラマを取り上げてた雑誌の広告を見たのを思い出した。
ところでスレ主のビルジョブズってまだ生きてるの?
618 :
デフォルトの名無しさん :2005/10/11(火) 20:41:26
callocのcって何の略ですか? ゼロクリアするのだからzallocのほうが自然だと思ったので気になりました
clearだろ
>>619 なるほど!胸がスーっとしました
ありがとうございます
C言語つったら本買った方が良いかな?みんなどうなの?
K&Rは神棚に奉ってる
んじゃあそのスレに誘導してほしいお・・・
誘導スレに誘導してほしいお・・・
甘えるなを並び替えるとエマニエルになるよ
「ニ」は何処からでてきた?
いいじゃん・・・教えてくれたって…みんなひどいよ、 僕、現実じゃ友達いないの、ネットでいっても「ヒキコモリか」とか言われて・・・ 実際僕ヒキコモリなんだよ、親にも迷惑かけてるし、家にいてもすることないの。 今中学三年生なんだけど高校いかないことにした、だからC言語学んで 将来そういう仕事つきたいの お願い、みんな本買ったりしてるの?オススメは?
ネタはキモいなぁ・・・今度は人を楽しませるネタで頼むわ>630
質問です。 double型の変数に数値を指定して、その小数点以下の値が入っている桁数を調べたいのですが、どのようにすれば出来ますか? 例としては 3.264000の変数は、3桁であると調べたいです。 目的は、電卓プログラムで計算した際に表示する計算値に使用したいです。 sprintfや、gvct等で実装しようとしましたが、手間がかかりすぎました。
ネタじゃないよ!いい加減にしてよ!キモくていいよ、どうせ引き篭もりだし、学校いってもキモイって言われまくるし。 学校ではいじめいろいろうけてるんだよ!物置の中に一日中閉じ込められたりとかもあったりした。 ネットでもみんな僕いじめるの?
>>633 少なくとも私はいじめるつもりはないけど。
引篭りをサポートするようなレスはしたくないな。
君の目指すべきは高卒検定試験ではないのか?
家貧乏なんです、高校いけないほど貧乏な家なんてないだろ、とか言ってるけどあるんです、ウチです だから本一冊買うのにも迷ってるんですよ・・・
>>632 sprintでできるのならそれで十分。
てか、こういうときは、自分はこうやったけど、他の方法ありますか? とソースを出すのもいいかもしれん。
なお、有限の2進数の小数では10進数の小数をあらわせないので注意。
>>632 その「3ケタ」と言うは、どう数えて「3ケタ」となったか考えたか?
考えたなら、その過程をそのままコードにすればいい。
考えてないなら、まずはそこを考えるべきだ。
>>633 人を楽しませるネタを書こう。
他人にサービスをしないのに他人からサービスを受けようってのは、ちょっとな。
主従以外の関係もあるから、それを経験することだ。
>>635 バイトすれば?
地域にもよるが、新聞配達は中学校からやれる。(小学校からやってるって話も聞く)
進学については、通信制高校は授業料安いし、時間も確保できるぞ。
成績や出席がよければ学費免除ってところもあるし、がんばれ。
と、養護施設で育って、通信制高校を出た漏れが書いてみる。
動的な多次元配列についての質問なのですが、 int array[16][16]に対し、int hoge = array[5][5]とアクセスするのと int array[16*16]に対し、int hoge = array[5+(5*16)]とアクセスするのでは どちらが速度的に有利なんでしょうか。 頑張ってアセンブラも学んでみたのですが、Releaseビルドでのアセンブラの吐き出し方が分からなくて…。 よろしくおねがいします。
どーだろ・・・? 何億回もアクセスさせて、時間計測してみたら?
予測:せんせーVC6でプロファイルできません!→当該の環境スレへ
プロファイルはしてみたのですが、誤差の範囲でした。 後学のため、ここなら詳しい人がいて、何かはっきりしたところが伺えるかもなと。 コンパイラによるのかも知れませんが。
>>645 VCでは実はReleaseでもデフォルトではデバッグできるようになっているよ。
だから混合モードを試してみたら?
>>646 どちらにしろ、速度云々は環境依存のスレ違い。
>>646 ありがとうございます
スレ違いになりますが、しかし私の実力だとシンボルがないと辛くて…
Release&シンボル付きで吐き出す方法があったはずなのですが…さっきから必死でヘルプ見てます
質問はその方法について、では無く、641ですのでひとつ
649 :
632 :2005/10/11(火) 22:48:30
>>636 了解しました、全体を写すと膨大になるので、その部分だけ書きますね
double d = 3.4560023;
int dec ,sign ,Len ,cnt;
char str[100];
char *pstr;
pstr = fcvt(d, 14, &dec, &sign);
Len = strlen(pstr);
pstr = pstr + Len - 1;
cnt = 0;
while ('0' == *pstr) {
pstr--;
cnt++;
}
pstr = pstr - Len + 1 + cnt;
Len = Len - (cnt + dec);
650 :
632 :2005/10/11(火) 22:49:58
switch (Len) { case (0): sprintf(str, "%14.0f", d); break; case (1): sprintf(str, "%14.1f", d); break; case (2): sprintf(str, "%14.2f", d); break; case (3): sprintf(str, "%14.3f", d); break; case (4): sprintf(str, "%14.4f", d); break; default: sprintf(str, "%14.5f", d); break; } これで画面に表示すると、0を取り除いた数が表示されますが 如何せん変数の宣言とソースの行数が多すぎて、もっと簡単な方法がないかと考えた次第です 良い知恵などあったらお願いします
>>650 sprintf(str, "%14.*f", (Len < 0 || 4 < Len ? 5 : Len), d);
ちょっと僕全課でスーパー行ってくるわ、近いし
653 :
初心者 :2005/10/11(火) 22:58:02
>>632 もとのdoubleの10進変換のときの精度はいくらー?
>636も言ってるけどそこ限界決めんといくらでも増えるよ
3.14をdoubleにいれてから小数点以下15桁まで表示すると
3.140000000000000 で桁数2だけど
無理やり16桁であらわそうとすると
3.1400000000000001 で桁数16になる
適度なところで抑えるが吉
>>649-650 「%g」で変換すれば何も考えることなく、
後続の0を取り去ってくれるが?
>>657 その時だけ「%f」で変換し直せばいいだけジャマイカ?
MS-C導入したんですが実行すると「プログラムファイル名が無効です」とでます、 どうすればいいんでしょうか? OSはXPです
>>659 まず、コミニュケーション能力を身につけろ。
人間相手に正しく意志を伝えられないのに、
機械に正しく意志を伝えられるわけがない。
そうですか、いきなり質問してすいませんでした。 で、どうすればいいんでしょうか?
662 :
651 :2005/10/11(火) 23:40:03
あぁ、
>>650 だけ読んで脊髄反射で答えてた。スマン。
>>649 作ってみたけど、精度を定めた時に丸めによる繰り上がりがあるから、
自前で計算するよりは確かに sprintf 使うのが楽やね。
#define LIMIT_MIN 0 /* limit (以下参照)の最小値 */
#define LIMIT_MAX 16 /* limit (以下参照)の最大値 */
int frac(
double d,
int limit) /* 考慮する小数点以下の最大の桁数 */
{
int i, digits;
char str[LIMIT_MAX + 2 + 1]; /* 2 は最初の 0. の分 */
if(limit > LIMIT_MAX)
{ limit = LIMIT_MAX; }
else if(limit < LIMIT_MIN)
{ limit = LIMIT_MIN; }
d = fabs(d);
d = fmod(d, 1); /* 整数部分を消去。これしないと整数部分が大きかった時に死ぬ */
sprintf(str, "%.*f", limit, d);
digits = 0;
for(i = 1; i <= limit; ++i) {
if((str + 1)[i] != '0') { digits = i; }
}
return digits;
}
>>649 激しく脱力。もともと、何度も指摘されてるように精度の問題等もあるし、
switch文は "%14.*f" の指定でいいのだけれど…
そのソースだと単純に sprintf(str,"%80.14f", d) した結果の末尾の '0' を
'\0' で潰すだけでもかまわないように思えるが…
fcvtの変換結果の文字列を加工してもいいしどうにでも…
sprintf( str, "%14g", val ); if( strchr(str,'e') || strchr(str,'E') ) { sprintf( str, "%14.f", val ); } で、いいんジャマイカ?と思うのはオレだけか?
わかりました、回線切って首吊って死にます、さようなら
667 :
632 :2005/10/11(火) 23:51:54
皆様ありがとうございました 改めて自分の愚かさを痛感している次第です。 お答えを見たところ、幾つか簡単に今のプログラムに組み込めそうなものがありましたので そちらの方法で実装させて頂く事にします。 お手数をお掛けして、申し訳ありません。 追記:表記したソースを使用してはならないという方はお手数ですが書き込みをお願いします 使わないようにしますので。
669 :
初心者 :2005/10/12(水) 00:50:19
>>577 はちょっと難しいです。
プログラムのせていただけませんか?
まだCをはじめたばかりなのでこの課題をひとりで作るのは困難です。
よろしくお願いします。
>>669 まず、Cの勉強をしようとは思わないのか?
>>669 17日の13:00までならまだまだ時間あるしね。
>>669 スレ違い。
そもそも、学生ならわからない事はまず教員に聞け。
授業で教えていないことは課題として出さないだろうから、
きちんと授業を聞いて、わからない所はわかるまで質問する、
と言う普通の授業態度を取っていれば問題なくこなせるはずだろ?
大学生以外で先生に聞きに行く奴なんて、よっぽどのガリ勉キャラくらいだろ 669擁護する気はないけど、長文便乗説教ウザス
確かにここ数スレみても中身のない説教ばかりだなw 質問スレなのに
676 :
デフォルトの名無しさん :2005/10/12(水) 09:16:40
wwwwwwwwwwwwwwww
説教とか、ググれ、スレ違い指定、勘違いレスなんかはさ、 そんなレス付けて流れ止めるくらいならスルーしてくれってのが良くあるな。 流れ止めたくなくて反論するんだけど、 それだとどうしてもこっちが厨房っぽく見えちゃうから、もう打つ手がない。
まともに答える能力がないのを隠すためにやってるんだろな。 カワイソス
>>677 おいらが嫌なのは、どう見てもミーより分かってなさそうなお方が見当違いの事書いてくるの
で、なんか質問の回答自体は絶対来ないの
お願い無理してまで参加しないでーって思う
680 :
デフォルトの名無しさん :2005/10/12(水) 09:43:55
>それだとどうしてもこっちが厨房っぽく見えちゃう うはwwwおkwwww
取り合えず、解答貰ってる質問と貰えず煽られただけの質問を比べてみ
解答出来ないんなら書き込むなっつー事でよろ > 無能回答者
スレ違い
例え下らないレスでも、上級者が上手いこと取り上げて建設的に賑わった昔の技術系掲示板 或いは、そんなレスは完全華麗にスルーされ、スレが汚れることはなかった ネット人口が増え、能力差も顕著になった昨今、 誰でも優位に立てるキーワード「ググれ」、「本買え」、「スレ違い」、 …そして自己満足な「説教」だけが蔓延る、思考停止状態に このコピペを思い出した
アンチ説教厨ウザ杉。このスレでは答えてもらえないんだから他行けよ
説教するなっていう説教が鬱陶しいです。
アンチ説教厨ってwww 説教して欲しい奴がいるのかwwwww あ、説教したい奴がいるんだwwwwwwwwww
>>672 は生徒に無視されてる専門学校の講師。
でも、何が質問したいのかわからんやつと
何聞かれてるのかわからんやつの間には
壁があるのも事実かと。
690 :
デフォルトの名無しさん :2005/10/12(水) 14:24:32
はい、では次のしつもんドゾ
おまいら無理やりでもいいから、話はCに絡めてやってくれ
692 :
デフォルトの名無しさん :2005/10/12(水) 14:35:48
「ハッシュ法の流れ図を書け」という宿題が出たのですが、どう書けばいいのかわたしにはよくわかりません。 流れ図の載っているサイト教えてください。
はいはい。Googleで探せと言わせたいだけだろ。
694 :
デフォルトの名無しさん :2005/10/12(水) 15:06:11
なかなか見つからないんです。
695 :
デフォルトの名無しさん :2005/10/12(水) 15:09:49
★シュワルツネッガー知事の拒否で、カリフォルニア州の「反日教科書」法成立せず
・いわゆる「南京大虐殺」など、旧日本軍の残虐行為をカリフォルニア州の教科書に
書き込むことを目的とした法案に、シュワルツェネッガー知事が署名を拒否しました。
この法案は、州の中学高校で使用される教科書について、第二次大戦中にアジアで
起きた出来事に、もっと分量を割くことを求めるもので、先月、州議会を賛成多数で
通過していました。提案者の議員は教えるべき具体例として、いわゆる「南京大虐殺」を
挙げていました。法案を後押ししたのは、日本の常任理事国入り反対の署名活動を
展開した在米の中国人団体らで、「南京大虐殺」などの旧日本軍の残虐行為をアメリカ
で歴史的事実として定着させることが、推進派の最大の目的でした。しかし、拒否権を
持つシュワルツェネッガー知事は7日、「アジア諸国の役割について学習することは、
すでに認められている」として署名を拒否し、法案は成立しませんでした。
http://www.tv-asahi.co.jp/ann/news/web/inte_news8.html?now=20051009245834 ※ニュースは既に削除されています。
くだらん質問に回答もらえなかったら回答者を無能呼ばわり禿ワロスwww
Googleで検索したらこのスレがヒットしました
698 :
デフォルトの名無しさん :2005/10/12(水) 17:38:53
CでもC++でも結構です。 どなたか、エキスパートシステムのコードがある サイトはご存知ないでしょうか? GUI抜き、バリバリのロジックonlyで、かつ、 いや、だからこそ、再帰構造なんかを使った スッキリしたプログラムを期待してます。
Prologなら手元にあるよ
700 :
デフォルトの名無しさん :2005/10/12(水) 23:21:25
超低級な質問で申し訳ない。 現在、Cにプログラムで、512×512の行列の積を計算するプログラムを設計 しているのだが、UNIX環境では動作するのだがWindowsだと どうにも上手くいかない。 コイツは、Windowsだと仕方が無いことなのだろうか……
たぶん、スタック不足なんだろうから、配列の前にstaticでも入れたら?
>>700 うまくいかない状態の説明くらいしろボケ
703 :
デフォルトの名無しさん :2005/10/12(水) 23:33:24
↓ここで説教厨が登場
都合の悪い事はなんでもWindowsのせいにすれば済むんだから楽だよな。
705 :
デフォルトの名無しさん :2005/10/12(水) 23:35:25
蒸し返して悪いのですが、
>>599-602 って明確に定義されているんでしたっけ?
この例でいうと、&&の左辺が真の場合、右辺は絶対評価されることはない、
って決まってるんでしたっけ?
決まってる。
>703-704 ワロッシュwww
708 :
デフォルトの名無しさん :2005/10/12(水) 23:38:57
>>702 a[512][512];←と定義すると、この処理に入った瞬間に
プログラムが強制終了する。
UNIX(soraris 9.0)で動かすと、この不具合は生じない。
>>708 スタックに取られるから、
配列が大きいと、スタックがオーバーする。
711 :
705 :2005/10/12(水) 23:48:23
>>706 ありがと。もう一度規格書読み直してみます。
短絡演算子。
713 :
デフォルトの名無しさん :2005/10/12(水) 23:52:59
staticってことはつまり、 静的変数として領域を確保することなんですよね。 動きましたΣ(゚Д゚) どうも、ありがとうございます。
>>701 でつ。てけとーでも言ってみるもんですな。
>>705 そういうようには決まっていない。その例の場合、寧ろ必ず評価される。
勿論左辺が偽の場合は右辺は評価されることはない。
>705
>>705 ショートサーキットでググれ
と言いたかったのだが、ググってみるとノイズが多いな。
少なくとも規格では、
左項で条件式の結果が一意に決まる場合には
右項は評価されないとされている。
&& の場合は、左項が偽の場合には右項を評価するまでもなく偽になり、
|| の場合は、左項が真の場合には右項を評価するまでもなく真になる。
これをショートサーキットと言って、
その NULL チェックはショートサーキットの利用例としてポピュラー。
ただ、もしこの規格を無視したコンパイラがあって、
やむを得ずそのコンパイラを使わなければならない状況なのであれば、
ショートサーキットを使わないようにせざるを得ない。
ただ、そんなコンパイラの話は聞いたことないが。
1)先輩が詳しくない 2)先輩がカンチガイした 3)先輩は先を見越して、他の2項演算では挙動がちがうことを伝えようとした
4)先輩が知っているのはE.T.の外側の皮をベリベリ剥がしたら中身はこんなロボットだった、ってな感じの映画
5) 先輩というのは実は自分で、後輩にえらそうに言ったことが間違ってたような気がして聞いてみた
>>717 > ただ、もしこの規格を無視したコンパイラがあって、
それはCのコンパイラではない。
なんちゃってCコンパイラか何かだろ?
規格通りに動かなくて良いなら規格は何の為に存在するんだ?
723 :
デフォルトの名無しさん :2005/10/13(木) 14:26:45
>>723 CでK&Rといえばそれしかないだろ
言語の策定に携わった人間が書いた、もはや解説書というより仕様書といった方がいいような代物
入門書読み終えたらK&R読むことをお勧めする
726 :
723 :2005/10/13(木) 15:19:37
まあK&Rは当然古くてC99には対応していないので その辺は注意だ
>>725 買わなくても読めるし、(事実上)拾える。
>>728 確かに読めるし、持ってるけど...アレって字が汚くないか?
一応違法だし、その方法を初心者に勧めたくない。
・・・せめて、検索できればな・・・JISC
いつも思うが、規格書ぐらいPDFで無償配布しろと
732 :
デフォルトの名無しさん :2005/10/13(木) 16:39:07
意見を聞きたいのですが、 設計環境をC言語とし、乱数の値を代入し、 n行の正方行列の積を計算するプログラムを設計しました。 積の計算の速度を高速化させるための手法としてなにか無いでしょうか? (計算の始めから終わりまでをtimeよりストップウォッチで調査)
733 :
デフォルトの名無しさん :2005/10/13(木) 16:40:35
先生!質問です。 C言語のソースでステップ数を尋ねられた場合、行数で返答すればよいのですか? 教えてください。
>>732 今どう書いてるかによるんじゃない? 現状タコなら速くなる
コメント、空行を除いた行数だな・・・ while ((c = getchar) != EOF) if (isdigit(c)) count++; さすがにコレを1ステップと数えるのはいかがか・・・。
ありがとうございます。 Doxygenでカウントできましたっけ?
738 :
734 :2005/10/13(木) 16:49:55
>>736 なるほど
まあステップ数問題にするのがあれだと思うけど
>>738 そうなんすよ。10年以上Cで組んでるのにステップ数を聞かれたのって
初めてだったんで面食らった。
740 :
734 :2005/10/13(木) 16:56:23
>>793 なんだ、素人質問じゃなかったのか
だったら相手の意図を汲み取って洒落を混ぜて答えちゃえば?
俺は空行もコメントもソースとして意味があって付与しているという自信があるので ステップ数=行数としている 決してボッタクリの為ではない。一応Pro*Cの場合は変換前のステップ数で出すし...
>>740 Cスレでポインタをミスるんじゃねぇ!!
743 :
734 :2005/10/13(木) 17:21:58
ごめん
744 :
kogi :2005/10/13(木) 17:31:28
質問です。とある計算の計算結果がオーバーフローしないように 計算結果を表示するには、どうすればいいかわかりますか?
オーバーフローしないように計算したいのか。 それとも計算結果を表示する時に桁を制限して、 その制限を越えたら最大値を表示するようにしたいのか。
746 :
kogi :2005/10/13(木) 17:35:35
えっと、計算した結果が、オーバーフローしなければ 良いです。桁制限は特に使ってません
ごめん、オーバーフローって、どういうことを言うの?
多倍長計算ができるライブラリを探すんだな さもなきゃbcのソースでもパクれ
飽和加算のためだけに多倍長計算? あり得ない。
オーバーフローしないように計算表示ってのが何を指しているのかわからん。
signed? unsigned?
752 :
kogi :2005/10/13(木) 17:43:02
>多倍長計算ができるライブラリを探すんだな さもなきゃbcのソースでもパクれ すいません、詳しくお願いします
>>747 4桁しか表示出来ない場合で5000+6000を計算すると5桁目の1が入らないので1000と出力されてしまう。要するに桁溢れ。
755 :
デフォルトの名無しさん :2005/10/13(木) 17:45:30
一発、staticでやってみそ。 mallocで領域確保も手だな
756 :
kogi :2005/10/13(木) 17:47:24
>751 今はsigned型で組んでます
>>754 5000+6000をどうしたいのかイマイチ分からない
5000+6000を4桁に収めるのはそもそも無理だし
5桁にオーバーしたら9999にしろってことなのか?
759 :
kogi :2005/10/13(木) 17:49:29
>757 アンダーフローは考えなくてもいいですw
>>759 負の値が入ってくることは考えなくていいのか?
761 :
kogi :2005/10/13(木) 17:52:21
>>760 忘れてますたm(_ _)m
やっぱりアンダーフローも考えます
>>761 となると、少し面倒だな。
x も y も正の場合はオーバーフローの可能性がある。
x も y も負の場合はアンダーフローの可能性がある。
両方で符号が違う場合は、どちらの可能性もない(2値の間の値になるから)。
x も y も正の場合、オーバーフローを抑制する必要があるが、
x + y > 最大値 ? 最大値 : x + y
のようにすることはできない。
なぜなら、最大値を超えるとオーバーフローするから、
x + y > 最大値 という条件式はあり得ない。
なら、移項すればいい。
同じようにして、負の場合も
x + y < 最小値 ? 最小値 : x + y
とできないから、移項すればいい。
763 :
kogi :2005/10/13(木) 18:06:07
>>762 えっと、C言語初心者なんでよくわからないのですが、
移項ってどういう意味ですか?
( ゚д゚)カポーン
cの言葉じゃないと思うが・・・
小学生がカウンターストップを作ろうとしてるんじゃね?
自分でも何がしたいのか解ってない奴が来ると スレ進行が早いね。
オーバーフロー、アンダーフローが発生したときにどういう振る舞いをさせたいんだね? 計算機は機械である以上、絶対にオーバフローすることがある。 多倍長計算ライブラリであってもメモリやディスク容量を超える桁数は扱えない
>>758 数字を変えて説明するぞ。
4桁の電卓があったとしよう。それにまず7000を入力。さらに9000を足すと16000になるが、5桁目は用意されてないので1は切られてしまう。1(10000)が切れたからといって最大数(9999)になる訳ではない。
そもそもデジタルはそんな融通の利く奴じゃない。ちゃんとプログラムしてやらないと9999にはならんぞ。
大変です!
>>763 の脳みそがオーバーフロー起こしてます。
772 :
758 :2005/10/13(木) 19:07:37
>>744 もう一度、理解可能な日本語で表現してみてくれないか?
「とある計算」が何か、またオーバーフローさせないというのは、どういうことを指すのか・・によって話がちがってくる。
>>725 JIS X3010はPDFならタダで読める。
>>763 ・・・・・・・・。
x + y > MAX
y > MAX - x
x > MAX - y
こういうのならったべ?
不等号じゃなくて等号だったろうけど。
中学かもしれないが、不等号も習う気が。
% cat aaa.c int main() { const char **cpp, *cp; char **pp, *p; cpp = pp; cp = p; return 0; } % gcc -Wall -c aaa.c aaa.c: In function `main': aaa.c:5: warning: assignment from incompatible pointer type どうして片方だけ警告が出るんでしょう?? どっちもnon-constな変数からconstな変数に代入しているのに
>>778 const は char を修飾しているから。
>>778 こうならいける。
typedef char *pchar;
const pchar *ppp;
pcp = pp;
C言語でBerkeleyDBを扱う方法を教えてください。。。
man dbで出てくるやつ?
787 :
784 :2005/10/14(金) 16:51:40
>>786 ありがとうございます。
これかもしれません。今から詳しく見てみます。
788 :
デフォルトの名無しさん :2005/10/14(金) 17:22:04
たとえば、sigaction()でSIGSEGVを捕捉したい時に、そのハンドラを sigaction構造体のsa_handlerで設定しますよね。 でも、これを設定してしまうと、今度はSEGVした時にcoreを吐かなく なってしまうと思います。 coreを吐かせるようにする(捕捉した関数の動作+元の動作も行いたい) にはどうしたらいいのでしょうか?
該当スレで聞くといいよ。
struct a { int m1; int m2; } void func() { int a = {0}; ... } このローカル変数aは全メンバがゼロ(NULL)に初期化されると 思いますが、構造体のメンバに構造体が含まれる場合でも = {0} で再帰的にゼロに初期化されるのでしょうか?
その前に、2重定義じゃなくて?
>>790 struct a b = {0};
ならば全メンバがクリアされる。構造体の定義を再帰的に行なうことはできないから、
再帰的に初期化されることはないが。
>>791-792 すみません、書き間違えました。
struct b {
int b1;
};
struct a {
int a1;
struct b a2;
};
void func()
{
struct a var = {0};
...
}
こう書いた場合に var.a2.b1 が 0 になることが
保証されているかどうか、でした。
794 :
デフォルトの名無しさん :2005/10/15(土) 00:30:18
C言語初心者(というかプログラミング全部)なんですけど、わかりやすくて いい参考書ないですか?
797 :
デフォルトの名無しさん :2005/10/15(土) 11:11:30
unistd.h このヘッダ名はなんと呼べばよいでしょうか? 標準へッダ?なのかな?拡張標準ヘッダ?
アンインストールスタンダードデーモンヘッダと読んだ、ってかシラネーヨ
ゆにえすてーでー
うにすてでぃ
ゆにっくすすたんだーど。えっち
802 :
デフォルトの名無しさん :2005/10/15(土) 12:05:03
ゆにっくすすたんだーどへっだ
ユニファイドスタンダード じゃないのか?
#include <stdio.h> void chomp(char *p); int main(void) { char str[10]; fgets(str, sizeof str, stdin); chomp(str); /* : : : */ return 0; } void chomp(char *p) { for(;*p!='\0';p++) if(*p=='\n') { *p = '\0'; return; } while(getchar()!='\n'); } これでバッファあふれ防ぐ&バッファクリア、できてますか? 過不足、改善などあればご教授下さい
strchrじゃダメ?
あ。それ以前に10文字以上の文字列があったらどうすんだ、ってとこか。 stdio.hがincludeされてるならBUFSIZで確保した方がいいじゃね? static char str[BUFSIZ]; みたいに。
>>805 fgetsの改行取り除きは、strrchrしてNULL以外なら'\0'代入で。
バッファクリアはscanf("%*c")で。
809 :
808 :2005/10/15(土) 16:00:23
ごめんscanf("%*s")に訂正
ちなみにscanf("%*[^\n]%*c");とすると改行文字までのバッファを削除できる。
改行も削りたかったので scanf("%*[^\n]%*c");がいい感じです。 ありがとうございました<(_ _ )>
812 :
デフォルトの名無しさん :2005/10/15(土) 17:21:01
ソースの中にある<config.h>ヘッダが見当たらないのですがこれは、<_G_config.h>と同義ですか?
config.h.inから自動生成されていることが多い
814 :
812 :2005/10/15(土) 18:03:22
>>813 さん
レス有難うございます。autoconfの勉強をしてみようと思います。
817 :
デフォルトの名無しさん :2005/10/15(土) 20:38:14
共用体について質問があります union{ char ch[2];
818 :
デフォルトの名無しさん :2005/10/15(土) 20:45:51
失礼、途中で書き込んでしまいました union{ char c[2]; short i; } としたときのメモリについての質問です 独習Cには |------c[0]------||------c[1]------| □□□□□□□□□□□□□□□□ |----------- i ------------| こんな感じに割り当てられる、と図解してあったのですが、 c[0] とc[1] の順序はあっているのでしょうか? ビットシフトの例題で、ピンとこないものがあったのですから……
あってると思う。
>>818 c[0]がより低位のアドレスに置かれることは保証されている。
それがiの上位バイトになるか下位バイトになるかは実装依存。
#所謂エンディアンの問題。
そこまでは正しい。 どっちが上位桁・下位桁になるかはCPU依存。
>>819-821 ご返答ありがとうございます。
環境により異なるものなんですね。
エンディアンの問題、非常に勉強になりました。
勉強不足が身にしみます。
C標準の関数で標準入力がリダイレクトされているかどうかチェックすることは できるでしょうか? C言語でコンソールアプリを作る勉強のために、リダイレクトされていればEOF まで入力を取得し、されていなければキーボードから入力(改行まで)を取得 するプログラムを作りたいのですが。 EOFが来るまで入力を取得し続けるコードだけだと、リダイレクトされていない 時にユーザがキーボードから改行を入力しても入力の取得を終了できない ので、上記のチェックをしたいと思いました。 環境は OS: WindowsXP IDE: WideStudio です。 コンソールアプリの作り方やWin32 APIで上記のチェックを行う方法は分かって います。Cの標準ライブラリでできるかどうかが知りたいです。よろしくお願いします。
>>823 そもそも、リダイレクトと言う概念がない環境もある訳で。
と言うか、リダイレクトされたデータに改行が含まれている場合はどうするのかと(ry
# DOS系だとCtrl+ZでEOFが入力できたはず。
UNIXはCtrl+D
JAVAではたとえば int i; println(i+".bmp"); i++; みたいにできますが,これをC言語でやるにはどうすれば良いでしょうか? 100個くらいのファイルを出力するときに,0.bmp,1.bmp.. のようにファイルが出力されるにようにしていのですが... よろしくお願いいたします.
>>823 標準関数ではないが、isatty()が使えるかどうか試してみ。
ま、端末からEOFを食わせる方法が欲しいだけなら
>>824 >>825 でいいんだが。
int c; printf("%d.bmp\n", i++);
>>830 int i;
i = 0;
printf("%d.bmp\n", i++);
~ を使った簡単な暗号化です #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *from, *to; char ch1, ch2; if(argc != 2){ puts("command error"); exit(1); } if((from=fopen(argv[1], "rb"))==NULL){ puts("open error -- argv[1] --"); exit(1); } if((to=fopen("ango", "wb"))==NULL){ puts("open error -- ango --"); exit(1); }
while(!feof(from)){ if(fread(&ch1, sizeof ch1, 1, from) != 1){ puts("read error -- argv[1] --"); exit(1); } ch2 = ~ch1; if(!feof(from)){ if(fwrite(&ch2, sizeof ch2, 1, to) != 1){ puts("write error -- ango --"); exit(1); } } } fclose(from); fclose(to); return 0; } ファイル名を指定して実行すると、 read error がでてしまいます 色々考えたのですが、理由がわかりません わかる方おられましたら、教えてくださらないでしょうか
feofについて詳しく調べるといい
リードエラーがeofの所為なのかどうかを調べるのがfeof()
30点くらいはあげてやれよw
#include <stdio.h> int feof( FILE *stream ); 概要 feof() 関数は、stream が指すストリームのファイル終端インディケータをテストします。 パラメータ stream ファイル終端インディケータをテストするストリームへのポインタです。 戻り値 feof() 関数は、次の値を返します。 0 stream には、ファイル終端インディケータが設定されていません。 0 以外の値 stream には、ファイル終端インディケータが設定されています。 eofかどうかを調べるのはエラーになってからだろうから あながち嘘とは言えないな >836
>>839 「ストリームの終端に達すること」はエラーでも何でもない。
エラーが発生したかどうかはferror()でテストする。
だから、零点。
>エラーが発生したかどうかは fread()とかの戻り値じゃね?
>>841 fread()の仕様を100回嫁。
fread()の戻り値だけではEOFとエラーを識別できない。
だから、fread()を使う場合は、ferror()でテストする必要がある。
ホント、fread()のインタフェースって糞だよな。元になってる
システムコールのread()の方が100倍マシだ。
fread() 関数は、次の値を返します。 読み取られたメンバ数 正常終了。戻り値は、正常に読み取られたメンバの数を示します。 この値が 指定したメンバの数 より小さくなるのは、読み取りエラーまたはファイルの終端が発生した場合だけです。
844 :
833 :2005/10/16(日) 03:48:09
「終端」がどこなのかとか調べるために、色々と実験してみました なんとなく、本当になんとなくですが、感覚的にわかりました 終端とか、ファイルの始まりとか、そういうことをしっかりとやらなくてはならないようです 使用している書籍には、このことが曖昧にかかれているので、詳しく調べてみます (ただ単に、私の読解力がないだけかもしれませんが) みなさん、どうもありがとうございました
>>844 ・実際に読んでみなければ読めるかどうかは分からない。
・読んでみて読めなかった場合、
1. それがファイルの終端だった場合はEOFフラグが立ち、以降
feof()が非0の値を返すようになる
2. それがエラーのせいだった場合はエラーフラグが立ち、以降
ferror()が非0の値を返すようになる
と理解しなされ。
つまり、「今」feofが0を返したからといって、次のfread()が
正常に実行できるかどうかは全く分からないのだ。
>>843 そうなのよ。
read()の場合はエラーなら-1、EOFなら0を返すから識別できるんだけどね。
ホントにマヌケな仕様。
間抜け同士がののしりあうスレ
848 :
833 :2005/10/16(日) 04:38:52
>>845 ネットで検索しても、あまりシックリと来るものがありません
>>845 さんのは、私が知りたいことの要点を得ているので、
C言語に関する知識がしっかりとつくまではそれで覚えておこうかと思います
ご丁寧にありがとうございます
まぁ、普通はエラーなのかファイル終端なのか区別する必要もないがな。 教条主義的には区別したくなるものなのかも知らん。
850 :
823 :2005/10/16(日) 09:52:43
>>824 >>825 >>829 レスありがとうございました。
Windowsでisatty()が使えました。リダイレクトに対応しつつ、キーボードからの
入力時にはユーザが改行だけで入力を終わらせられるようにしたかったので、
isatty()で希望が満たせそうです。
isatty()はとりあえずWindowsとUNIX系OSでは使えるようなので、パソコン向けに
フリーウェアを作る場合などには十分使えるかなと思いました。
質問です。下の n! を求めるプログラムを作ってみたのですが, float型をdouble型にしたいのですがうまくいきません。 どうすればいいのでしょう? #include <stdio.h> int main() { float a, i, n; printf("n = "); scanf("%f", &n); a = n; for ( i = 1.0 ; i < n ; i++ ) { a *= ( n - i ); } printf("n! = %.0f\n", a); return 0; }
>>851 >うまくいきません
期待しているのは何ですか?
でも実際には何がどうなってしまうのですか?
>>851 ループ制御変数は整数型で充分かと。
つーか、nとiを使い分ける意味がない。
問題点の切り分けくらい(略
855 :
851 :2005/10/16(日) 13:42:48
>>852 さま
レスありがとうございます。
4行目の
float a, i, n;
を
double a, i, n;
としてもコンパイルできるのですが,
n = 5 として 5! を計算しても
正しく120と出ません。
>>851 doubleにするならまずscanf("%lf", &n)に変えてくれ。話はそれからだ。
(念のためだけど、printfは変更せずに)
%f -> %lf
858 :
851 :2005/10/16(日) 13:58:45
>>856 さま
ありがとうございました。
解決しました。
1/2が0.5になりませんってもの良くある質問だな。
話はそれから、はスルーされますたw
861 :
851 :2005/10/16(日) 14:29:18
>>853 さま
>>ループ制御変数は整数型で充分かと。
>>つーか、nとiを使い分ける意味がない。
ということでしたので,書き直しました。
#include <stdio.h>
int main()
{
double a;
int n;
printf("n = ");
scanf("%d", &n);
a = n;
while(n > 1) {
a *= ( n - 1 );
n--;
}
printf("n! = %.0f\n", a);
return 0;
}
お、また出たな!
a = n; while (n > 1) { a *= n--; } とでもしたほうがすっきりするんで内科医?
864 :
851 :2005/10/16(日) 15:09:22
>>863 さま
a = n;
while(n > 1) {
a *= --n;
}
でうまくいきました。
そこで一句 C言語 教えた奴が 教えられ
867 :
デフォルトの名無しさん :2005/10/16(日) 15:29:05
基本的なことを教えて下さい。 ご承知の通り: A)int (*f[3])(int); これは関数ポインタの配列です。 B)int (*f(int))(int); これは関数ポインタを返す関数です。 では、 関数ポインタの配列(又はその配列を 指すポインタ)を返す関数は どう宣言したら良いのでしょうか? 引数はintで戻り値がA)のような。
868 :
デフォルトの名無しさん :2005/10/16(日) 15:41:42
これ教えてください 0以上100以下の整数データをキーボードから複数入力し@それらのデータ数 A平均値B10刻みのヒストグラムを画面表示するプログラムを作成しなさい 負の数が入力されるまで入力を続け、*を並べて表現すること。 例 入力データ数:26 平均値:50.9 0−9:*** 10−19:* . . . 90−100:**
>>867 int (**f(int))(int);
だけど、ここまで書くとぐちゃぐちゃするから素直にtypedefを使って
typedef int (*PFUNC)(int);
PFUNC *f(int);
と書いた方が素直な気がする。
int (*(*aaa(int a))[3])(int) { static int (*f[3])(int); return &f; } これでコンパイル通った
typedef int (*p)(int); typedef p a[3]; typedef a *pa; 最初これでやったのをひとつずつ戻していった
873 :
デフォルトの名無しさん :2005/10/16(日) 16:54:39
先生,諸兄姉、アドヴァイス有難う御座います。 早速試してみました。VC++6.0です。 でも、warningが出るようですが? #include <stdio.h> void (*koe)(); void (*koe2[2])(); void tigersfun(){ printf("タイガーズが勝ったら,金なんかどうでもエエんや!\n"); } void murakami(){ printf("世の中金やで、タイガーズで一儲けせんかい!\n"); } void (*koe3())(){ return &murakami; } void (*(*koe4())[2])(){ static void (*koe2[2])(); return &koe2; }
874 :
デフォルトの名無しさん :2005/10/16(日) 16:55:15
int main(void){ int i; //*koe関数ポインタを使う。 koe=tigersfun; koe(); koe =murakami; koe(); //*koe2関数ポインタ配列を使う。 koe2[0]=tigersfun; koe2[1]=murakami; for(i=0;i<2;i++) koe2[i](); //*koe3関数ポインタを返す関数を使う。 koe = koe3(); koe(); //*koe4関数ポインタ配列を返す関数を使う。 *koe2=koe4();/* warning C4047: '=' : 間接参照のレベルが 'void (__cdecl *)()' と 'void (__cdecl *(*)[2])()' で異なっています。*/ koe2[0]=tigersfun; koe2[1]=murakami; for(i=0;i<2;i++) koe2[i](); return 0; }
void (*((*koe22)[2])) (); koe22 = koe4 (); (*koe22)[0] = tigersfun; (*koe22)[1] = murakami; for (i = 0; i < 2; i++) (*koe22)[i] (); これで動いた
質問です。 コンパイルしてできたオブジェクトファイルのサイズを小さくしたいんです。 どうやら.mdebugというセクションが大きくなっている原因のようなんですが、 これには何が入っているのですか? 基本が無い為、的外れな質問をしてしまっているかもしれませんが宜しくお願いします。
877 :
名無し :2005/10/16(日) 17:41:25
<<577期限が近いのでよろしくお願いします。
879 :
デフォルトの名無しさん :2005/10/16(日) 17:50:08
>875 先生有難う御座いました。 確かに動きました。私もうっかりしてましたが若干本来の目的から ずれてしまったような? //*koe4関数ポインタ配列を返す関数を使う。 koe22=koe4(); //でいきなり for(i=0;i<2;i++) (*koe22)[i](); //と使用出来ないと意味がないですよね?
880 :
デフォルトの名無しさん :2005/10/16(日) 17:50:17
>>879 こういうことがやりたいんと違うの?
void tigersfun() { printf("タイガーズが勝ったら,金なんかどうでもエエんや!\n"); }
void murakami() { printf("世の中金やで、タイガーズで一儲けせんかい!\n"); }
void (**koe4())()
{
static void (*koe2[2])();
koe2[0] = tigersfun;
koe2[1] = murakami;
return koe2;
}
int main()
{
void (**koe)();
koe = koe4();
for (int i=0; i<2; i++)
koe[i]();
}
>>879 そうしたいならこうでもしとけばいいんじゃないの
void (*(*koe4 ())[2]) ()
{
static void (*koe2[2]) () = {tigersfun, murakami};
うわぁ、スレ移動と言うよりレスも検討せずマルチで、またマルチで催促かよ、、、、
884 :
デフォルトの名無しさん :2005/10/16(日) 18:36:30
先生方有難うございました。koe5案が一番スッキリしていますので これを採用することにします。 #include <stdio.h> void (*koe)(); void (*koe2[2])(); void tigersfun(){ printf("タイガーズが勝ったら,金なんかどうでもエエんや!\n"); } void murakami(){ printf("世の中金やで、タイガーズで一儲けせんかい!\n"); } void (*koe3())(){ return &murakami; } void (*(*koe4())[2])(){ static void (*koe2[2])(); koe2[0]=tigersfun; koe2[1]=murakami; return &koe2; } void (**koe5())(){ static void (*koe2[2])()={tigersfun,murakami}; return koe2; }
885 :
デフォルトの名無しさん :2005/10/16(日) 18:37:19
int main(void){ int i; void (*((*koe22)[2])) (); void (**koe6)(); //*koe関数ポインタを使う。 koe=tigersfun; koe(); koe =murakami; koe(); //*koe2関数ポインタ配列を使う。 koe2[0]=tigersfun; koe2[1]=murakami; for(i=0;i<2;i++) koe2[i](); //*koe3関数ポインタを返す関数を使う。 koe = koe3(); koe(); //*koe4関数ポインタ配列を返す関数を使う。 koe22=koe4(); for(i=0;i<2;i++) (*koe22)[i](); //*koe5関数ポインタ配列を返す関数を使う。 koe6=koe5(); for(i=0;i<2;i++) koe6[i](); return 0; }
>>885 どうでもいいけど、テスト用だからといって後で見てわけわからなくなるような名前をつける癖は治した方がいいかと
887 :
デフォルトの名無しさん :2005/10/16(日) 19:32:15
今晩はよろしくお願いします。 数字にコンマを入れたいのですが、 下記のようにしましたが、 char * konma(char a[]){ char *henkan; int strl= strlen(a)-1; int amari = strl % 3; int c =0; int count=0; if(amari!=0){ for(c =0;c<amari;c++){ *(henkan++) = a[count++]; } } *(henkan++)=',';//ここで、エラーが出ます。 while(c<strlen(a)){ for(int cc=0;cc<3;cc++){ *(henkan++)=a[count++]; } *(henkan++)=','; } return henkan; } 実行時にhenkan(不適切な・・)ハンドルされていないエラー がでます。ちなみにあまり0なので、最初のエラー場所が、 そこです。 どうすればよいのでしょう。教えてください。
>>887 初心者スレにでもどうぞ。
あー、エラーメッセージを書くことも忘れずに。
char *commanize(const char *string) { char *result; int i, j, len, ncomma; len = strlen(string); ncomma = (len - 1) / 3; result = malloc(len + ncomma + 1); if (!result) return NULL; for (i=1,j=1; i<=len; i++,j++) { result[len + ncomma - j] = string[len - i]; if (i % 3 == 0) { j++; result[len + ncomma - j] = ','; } } result[len + ncomma] = '\0'; return result; }
char * addStringFromIntWithComma(char * buf, int val) { char * p; if (val < 0) { p = strchr(buf, '\0'); p[0] = '-'; p[1] = '\0'; return addStringFromIntWithComma(buf, -val); } if (val >= 1000) { p = addStringFromIntWithComma(buf, val / 1000); return p + sprintf(p, ",%03d", val % 1000); } p = strchr(buf, '\0'); return p + sprintf(p, "%d", val); }
891 :
デフォルトの名無しさん :2005/10/16(日) 21:32:23
man(オンラインマニュアル)の記述は、初心者にはむずかしいように思いますが、 それは、英文を訳しているからしょうがないのでしょうか? もと理解できるようにスキルをアップしろと言われればそれまでですが。
manとか読んでると意味が分からなくて日本語に訳されてるの探して読んだら 自分が元のを読んだのと全く同じように訳されていて 結局なんだか分からなかったってことが何度かあった 日本語でも英語でも意味が理解できないという
>>891 詳細に書かれているだけで、難しくは無いだろう。
プログラムの書き方がわからないとか、C言語そのものがわからない
というようなレベルなら、教科書などで勉強するべき。
manは勉強のための資料じゃないから。
本に喩えれば丁度オライリーの1000円のデスクトップリファレンスシリーズみたいな感じだな
英語のほうをそのまま読めば良い ヘボ翻訳を読んでいるからますます理解できなくなるのだ
manだけじゃない MSDNとかもそう 日本語読んでると逆に混乱する
897 :
デフォルトの名無しさん :2005/10/16(日) 22:02:48
>>893 なるほど、man は仕様書と思うベきが正しいですね。
アドバイスありがとうございました。
898 :
デフォルトの名無しさん :2005/10/16(日) 22:19:39
>>887 です
>>889 さん
>>890 さん
ありがとうございます。
最初に、ためさせていただいたのが、
889さんのほうで、成功いたしました。
malloc関数で、メモリーの割り当てしてからするのですね。
890さんのほうは、ちょっと難しくて、
strchrとか再起とかもう少し理解するのにかかりそうです。
でもがんばって理解します。
本当にありがとうございました。
無理に malloc しなくてもいいんなら↓ #include <stdio.h> #include <string.h> #include <math.h> void foo(char *buf, int i) { int u = i; int n = sprintf(buf, "%d", i); char *p = buf; if (i < 0) {n--; p++; u *= -1;} p += (n - 1) % 3 + 1; n = (n - 1) / 3; while (n--) { sprintf(p, ",%3d", (u / (int)pow(1000, n)) % 1000); p += 4; } } int main(void) { char buf[80], s[80]; int i; while (fgets(buf, sizeof(buf), stdin)) { sscanf(buf, "%d", &i); for (; i; i /= 10) { foo(s, i); printf("%s\n", s); } } return 0; }
ごめん、上のは<string.h>いらない。 #include <stdio.h> #include <string.h> int bar(char *buf, int i) { int n; if (i < 0) { sprintf(buf, "%c", '-'); return bar(buf + 1, -i); } else if (i < 1000) { sprintf(buf, "%d", i); return strlen(buf); } else { n = bar(buf, i / 1000); sprintf(buf + n, ",%3d", i % 1000); return n + 4; } } int main(void) { char buf[80], s[80]; int i; while (fgets(buf, sizeof(buf), stdin)) { sscanf(buf, "%d", &i); for (; i; i /= 10) { bar(s, i); printf("%s\n", s); } } return 0; }
C言語でperlのhashの関数existsに当たるものはないのでしょうか?
903 :
デフォルトの名無しさん :2005/10/17(月) 12:02:55
>>902 C言語にはそもそもperlのhashに相当する機能が無いはずだが
>>904 >>1 読め。というか、それは "Berkeley DB" ライブラリのドキュメントを
ちゃと読めばいいだけなのは、ある程度の知性があれば自明のはずだが、
なんで C標準の話だと思ってるのか激しく問い返したい。
あー、最近仕事で分からないことは 2chで聞いてるけど、ついに2ch風レスがきたか。 分かったよ。もう自分で調べる。
はい。さようなら。
fj Newsgroup ならもっと叩かれるだろうしな。 冗談じゃなくほんとうに分かってなかったのが(仕事のくせに)すごいな。
感心感心。
911 :
デフォルトの名無しさん :2005/10/17(月) 14:21:52
qsort関数がイマイチわかりません 比較する関数は自分で作らなければなりませんが、 なぜ、 >, =, - などで昇格順が決まるのでしょうか 正数、負数、0 の値を返すことで、どのようなことが起きているのですか?
大小を比較することで並べ替えをしている・・・。 じゃ答えになってないの?
a < b の時、a - b < 0 a > b の時、a - b > 0 a = b の時、a - b = 0 OK?
a < b の場合、 順序は( a b ) と( b a )のどちらになるのでしょうか 質問の内容が明確でなくて申し訳ありませんでした
>>915 こういうのは駄目なの?<stable
int cmp(const void * lhs, const void * rhs) {
const T *l = lhs, *r = rhs;
/* ... 要素の値を比較して異なれば正または負を返す ... */
if (l < r) return -1;
if (l > r) return 1;
return 0;
}