3 :
デフォルトの名無しさん :2005/04/07(木) 12:46:30
3ちしげ3ゆ3様が電光石火の3ゲットなの!
>>1 番かわいいのはさゆなの!
ノノハヽヽ〃ノハヾ /)
>>2 じ本はハゲすぎなの!
後
>>10 は落ち目すぎなの! ∩*・ 。.・)从*・ 。.・)/ミ
〃ノハヾノノハヽヽノノハヽヽつ い
>>4 川は黒すぎなの!
矢
>>9 ちもフケすぎなの!⊂(。.・从(・ 。.・*∩ノノノハ 。.・)ノハヽ
(( (\ゝノノノハノハ〃ハ v)っ彡*・ 。.・)
あ
>>8 やはフケすぎなの! ⊂`ヽ从*・ 。.・)・ 。.・))ノノノハヽつ ))
>>5 んのは顔ふくれすぎなの!
大の大人が
>>7 っちとか(プ⊂\ ⊂ ) _つ从*・ 。.・)
(/( /∪∪ヽ)ヽ)/ U つ モー
>>6 すは売れなさすぎなの!
∪ ̄(/ ̄\) ゝし'⌒∪
>>11-1000 さゆのかわいさの前にひれ伏すの!
4 :
デフォルトの名無しさん :2005/04/07(木) 13:17:21
4さま
5 :
デフォルトの名無しさん :2005/04/07(木) 13:58:31
こんにちは 基本的な質問になりますが、 charstrings[MAX] = '\0' ; という初期化の方法はOKなのでしょうか? この場合だと、文字列終端に、文字列終端文字を入れるということになるということで よろしいのでしょうか?
6 :
デフォルトの名無しさん :2005/04/07(木) 14:11:55
修正 こんにちは 基本的な質問になりますが、 #define MAX 100 char strings[MAX] = '\0' ; という初期化の方法はOKなのでしょうか? この場合だと、文字列終端に、ヌル文字を入れるということになるということで よろしいのでしょうか?
それコンパイル通るかやってみた?
試してたらそんな質問するわけないだろ
>>6 配列の初期化の場合、そんな書き方はしない。
>>6 1. 配列なんだから = {0} で初期化
2. 文字配列なんだから = "" で初期化
どっちでも。
11 :
6 :2005/04/07(木) 15:29:44
13 :
デフォルトの名無しさん :2005/04/07(木) 15:58:01
char strings[MAX] = '\0' ;
14 :
デフォルトの名無しさん :2005/04/07(木) 16:01:15
*cp++ って、cp++と同位らしいけど、なぜ? cp++をした後にcpが指し示す内容(*cp)を表示するものだと思ってた。 (誤 *cp++ は、cp++の後*cp (正 *cp++ は、cp++のみ
>>11 のリンク先に間違いが幾つあるか賭けない?
漏れは少なくとも100はあるとみたね。
#誤字、誤変換を含む。
>>14 *cp++;
と
cp++;
を較べているので同意になる。
func(*cp++);
などのように、値を使用しているわけではない。
17 :
6 :2005/04/07(木) 16:14:39
>>16 よくわかりました。
本当にありがとうございます。
>>14 >>16 の解説を参考にしつつ、
ついでに、前置と後置の違いも勉強し直せ。
えらそーに
ディスプレイやPC本体を マヨネーズで磨くと新品同様にピカピカになる。 おまえらもやってみ?
歯磨き粉で磨くと傷が埋まる程度のレベル
マン汁で磨くとツルツルになるよ。
頼めよ。下手な鉄砲何とやらだぞ。
スレ違いだったか、悪かった
>>25 僕の経験から、そういうアルゴリズム辞典系の本はあまり役に立たないよ。
載っているのは基礎的なもので、サンプルプログラム集としてならみることもあるかもしれないけれど。
その中から一つだけ選ぶとしたら、奥村さんのアルゴリズム辞典かな。
29 :
デフォルトの名無しさん :2005/04/08(金) 12:22:11
>>28 そうやって、用意されているAPIしか触れないプログラマが量産されていくわけですね。
30 :
もうすぐ就職試験 ◆pTadMR86pE :2005/04/08(金) 12:25:35
ポインタの型キャストのことなのですが、 具体的にはどのように利用すればよいのでしょう?
>>29 違う違う、僕が言いたいのは、アルゴリズムは身に着けるものであって、
切り貼り技術ではあまり役に立たないということだよ。
一人称が「僕」はキモイ
じゃ、僕様チャン
僕もそう思ったw
>>31 >身に着ける
衣類じゃねぇんだぞ、ゴルァ!
ボクはいいと思うよ。
cygwinなんか絶対使わねー。
そんなもん入れるぐらいなら素直にLinuxやらUnixやらいれるです。
ファイル内のアドレス情報を保存して、後からその位置に移動できるようにしたい のですが、どうすれば良いでしょうか? OSはUNIXでコンパイラはCCです FILE *fp; FILE ffp = *fp; じゃ駄目ぽ?
位置を記録する変数作っておいてfseekで飛ぶんじゃだめ?
スマソ、自己解決ftellとfseekで出来るのねorz
45 :
デフォルトの名無しさん :2005/04/09(土) 17:31:39
char *str={(A%2) != 0)?"奇数です":"偶数です"} char str[]={(A%2) != 0)?"奇数です":"偶数です"} なんかの本でこんな感じのやつがのってて、戦うCプログラマだったけかな で上はコンパイルが通るが下は通らないなんでかわかるよなって・・って感じで 問いかけてくる本だったんだが、なんでかわかりません 一緒じゃねーの?教えてください
47 :
デフォルトの名無しさん :2005/04/09(土) 17:58:06
>>45 下のstrはcharの配列。
(A % 2) != 0) ? "奇数です" : "偶数です"
この式の結果はchar *だ。
charの配列はcharへのポインタで初期化できないから下はエラーになる。
(char s[] = "hoge";のような文字列リテラルでの初期化は例外的に出来るようになっているだけ)
なおstrはconst char *にする方が好ましい。
char s[] = {"こうやって書くべきじゃない?"};
↑もう少し具体的にどうぞ。
×char s[] = "こうやって書くべきじゃない?"; ◎char s[] = {"こうやって書くべきじゃない?"};
文字列はリストで管理しろよ。
54 :
デフォルトの名無しさん :2005/04/10(日) 12:16:12
>>28 あの本、一見よさげだが Huffman 法の説明とか読んでみな
char s[][1] = { 'h', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '\0' }; printf("%s\n", s);
56 :
デフォルトの名無しさん :2005/04/10(日) 12:30:19
>>55 (2) : error - unexpected statement
>>55 (2) : warning - implicit declaration is now obsolete.
57 :
デフォルトの名無しさん :2005/04/10(日) 12:41:14
そのままコンパイルする馬鹿
59 :
デフォルトの名無しさん :2005/04/10(日) 12:50:29
>>57 エスパーじゃないんで自動補完はできない
自分で自分をアフォと書くのも勝手だが
結果を見て吠え面かいてちゃ超がつくぞ
60 :
デフォルトの名無しさん :2005/04/10(日) 12:59:06
俺漏れも。エスパーじゃないんで
>>59 を理解できない。
自分で自分をアフォと書くのも勝手だが
結果を見て吠え面かいてちゃ超がつくぞ
61 :
デフォルトの名無しさん :2005/04/10(日) 13:00:47
>>60 スレタイも読めないアフォに同類と認められたくないんで、あんたにアフォと言われるなら名誉なことだ
62 :
デフォルトの名無しさん :2005/04/10(日) 13:02:14
>スレタイも読めないアフォに同類と認められたくないんで、あんたにアフォと言われるなら名誉なことだ 意味分からん。
63 :
デフォルトの名無しさん :2005/04/10(日) 13:02:47
ちなみにコンパイルなんかしてねえよ
64 :
デフォルトの名無しさん :2005/04/10(日) 13:09:02
だから、>スレタイも読めないアフォに同類と認められたくないんで の意味を教えろっての
65 :
デフォルトの名無しさん :2005/04/10(日) 13:10:14
66 :
デフォルトの名無しさん :2005/04/10(日) 13:12:26
アドレス演算子について警告しなかった意図すら通じていないような超のつくアフォが参加できるスレではない
67 :
デフォルトの名無しさん :2005/04/10(日) 13:13:02
>二度は言わん 一度目はどこで言ったんだよw
68 :
デフォルトの名無しさん :2005/04/10(日) 13:16:15
三度ももちろん言わない 誘導はした これより荒らしと見なす
>>67 「二度は言わない」と言ったら、その後にくるのが一度目でしょう。
致命的な莫迦ですね。
……前なんじゃないの?
「二度は言わん」=「一度しか言わん」
両方あり得る?
ほにゃららだ。もう二度は言わないぞ。
二度は言わないが、ほにゃららという事だ。
>>69 二度は言わないなら、もう言わないんじゃないか?w
俺は 「二度はない」=「次はない」と捉えたけど。
おい、スレ無駄にすんなよ、どうでもいいこと書くな。
ごめん、自己レスさせて。 >二度は言わないが、ほにゃららという事だ。 二度言ってるじゃんorz
二度は言わん 三度ももちろん言わない スレを無駄にする奴は これより荒らしと見なす
78 :
デフォルトの名無しさん :2005/04/10(日) 13:52:45
80 :
デフォルトの名無しさん :2005/04/10(日) 14:17:10
文字列の単語の数を調べたいのですが、 うまくいきません。どこがおかしいですか? voidmode2(FILE *fp) { intmoji[50] = {0}; inti, count = 0; charch; while(1){ ch = fgetc(fp); if(ch==EOF) break; if(ch==' '){ moji[count]++; count = 0; } count++; }for(i=0; i<50; i++)printf("%2d字は%2d回出現しました\n", i+1, moji[i]); }
81 :
デフォルトの名無しさん :2005/04/10(日) 14:20:25
>80 よく読みなおせ
>>80 void mode2(FILE *fp)
{
int moji[50] = {0};
int i, count = 0;
char ch;
while(1){
ch = fgetc(fp);
if(ch==EOF) break;
if(ch==' '){
moji[count-1]++;
count = 0;
continue;
}
count++;
}
if (count != 0)
moji[count]++;
for(i=0; i<50; i++)
printf("%2d字は%2d回出現しました\n", i+1, moji[i]);
}
85 :
デフォルトの名無しさん :2005/04/10(日) 14:43:08
>>85 お、ありがと。
char ch; -> int ch; だね。
こうかな。 void mode2(FILE *fp) { int moji[50] = {0}; int i, count = 0; int ch; while(1) { ch = fgetc(fp); if(ch==EOF) break; if(ch==' '){ moji[count-1]++; count = 0; continue; } count++; } if (count != 0) moji[count-1]++; for(i=0; i<50; i++) printf("%2d字は%2d回出現しました\n", i+1, moji[i]); }
なんかどっかの会社の新人研修とかじゃないだろうなぁ。。
89 :
デフォルトの名無しさん :2005/04/10(日) 18:24:20
何でfgetcをchar形で受けてはいけないんですか?
EOFが認識できないから
EOFは何者をも認識することはない。EOFはただ返されるのみだ。 正しく「EOFを認識できない」と言おうじゃないか。
C言語で 1 % 2 の答えが0になってしまうのですが何でですか? コンパイラはVC++です。
>>92 周辺のソース見せてみな。
君が間違っているはずだから。
94 :
92 :2005/04/10(日) 19:37:45
#include <stdio.h> int main(void) { int c; c = 1 / 2; printf("%d\n",c); return 0; } こんな感じです。
95 :
デフォルトの名無しさん :2005/04/10(日) 19:38:47
>>94 こらこら % と / の間違いは誤差じゃ済まんぞ
96 :
92 :2005/04/10(日) 19:40:44
すいません。 7行目 c = 1 % 2; にしてください。 実験しててそのままにしていました。
>>96 >実験しててそのままにしていました。
どうせ、ソースもそのままにして
コンパイルしてるんだろ?
1.ソースを「確実に」修正する。
2.「確実に」コンパイルする。
3.「確実に」実行する。
まず
>>92 が、これらを「確実に」行った後で
話を聞いてやるよ。
98 :
デフォルトの名無しさん :2005/04/10(日) 19:55:28
Z:\>notepad Z:\>type remain01.c #include <stdio.h> int main(void) { int c; c = 1 % 2; printf("%d\n",c); return 0; } Z:\>cl remain01.c Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.40607.16 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. remain01.c Microsoft (R) Incremental Linker Version 8.00.40607.16 Copyright (C) Microsoft Corporation. All rights reserved. /out:remain01.exe remain01.obj Z:\>remain01 1 Z:\>
・ソース書く ・ノートパッドで修正する ・ファイル名に勝手に..txtが付いて別ファイルになる ・一生懸命コンパイルするがコンパイルされるのは元のソースファイル
100 :
デフォルトの名無しさん :2005/04/10(日) 20:08:32
・「登録済みの拡張子は表示しない」になっていて事態は深刻
VCのコンソールプログラムから他のプログラムに入力し、結果を 受け取るにはどうすればいいのでしょうか? pipeを使うらしいのですが、いまいち分からないです。
VC で pipe ???
windowsでもリダイレクトやパイプは使えるだろ
>>101 スレ違い。ここで混乱を招く前に、VC++初心者スレかPC初心者板へどうぞ。
105 :
デフォルトの名無しさん :2005/04/11(月) 18:48:11
構造体のことについて質問です。 struct adrres_list{ char name[10]; char tell[10]; struct adrres_list *next_p; }; struct adrres_list *farst, *end, *now; struct adrres_list memoryOpen(void); int main(void) { char str[10]; farst = memoryOpen(); 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 } struct adrres_list *momoryOpen(void) { return (struct adrres_list *)malloc(sizeof(struct adrres_list)); } 以上のように書いたのですが、 コンパイラが farst = memoryOpen() のときに「'=' : 互換性のない型が含まれています。」 とエラーを返してきます。 どこが間違っているのでしょうか?
momoryOpen?
プロトタイプ宣言の戻り値がポインタになってないぞ。
>>105 > struct adrres_list memoryOpen(void);
> struct adrres_list *momoryOpen(void)
このへんが間違っていると思われ。
他に、
farst -> first
tell -> tel
adrres -> address
farst, end -> first/last か start, end
now -> current, cursor など
英語も頑張れ。
109 :
105 :2005/04/11(月) 19:01:09
・・・・・恥ずかしすぎる。 教えてくれてありがとう。
<graph.h>って最近のコンパイラには付いて無いんですか? VS2003やBCCに無いんですが…orz
自前で書きませう
そんな…もうDLできないヘッダなんですか?
ヘッダだけあってもライブラリがないから無意味では?
「もう」とか以前に標準的なライブラリじゃないからな。 最初っからついていない。
つるぼC でも使ってろ
どういう環境で使おうとしたのか気になるな
プリプロセッサについて質問です。 #define AAA ("123") #define BBB ("456") のとき "123000456"をdefineしたいときはどう書けばいいのでしょうか? #define CCC AAA"000"##BBB ではだめみたいなのです。
#define AAA "123" #define BBB "456" #define CCC AAA"000"BBB じゃだめなん?
119 :
117 :2005/04/11(月) 21:16:37
>>118 ありがとうございます。できました。
括弧つけちゃいけなかったです
C言語をはじめたばかりであまりわからないのですが、 ビットシフトはなんの役に立つのでしょうか?
>>120 C言語をもっと勉強してからもう一度来てください。
>>120 必要になるまでほっとけ
もしかしたら一生必要にならないかもしれないし
いつかどこかで必要になるかもしれない
2で割るとき。 //まあ、最適化があるから、ふつーは意識しないのだが。
125 :
120 :2005/04/12(火) 01:28:15
例えば32bitに格納されてるRGBAをバラしたい時とか エンディアンを変換したい時とか
>>125 PCでは出番は少ないけど
組み込みとかでフラグを一つの変数に詰め込んだりとか
APIにもビットフラグを指定させるのがあったり(defineされてるけど)
あとは
>>126 とか
ソフトでpacked演算をしたい時とか
なんだ釣りか
printf("%s", NULL); これで文字列 "(null)" が出力されるのは標準だと思っていいの?
うちのコンパイラでは "nullpo" と表示されます
>>131 ヌルポインタの指す領域をアクセスした時の動作は未定義。
したがって、その動作は規格に(JISでもISOでも)違反していない。
そういう意味では、標準。
どの処理系でも同じ動作をするか?という質問なら標準ではない。
おやつの昆布、全部食べちゃいました。 どうしたらいいですか?
死ねばいいと思うよ
>>134 #include <stdio.h>
int main(void)
{
printf("Hello, world!\n");
return 0;
}
int main(void) { if (!昆布) { 買う(昆布); } 食べる(昆布) return 0; }
int main(void) { おやつ 昆布; for(; ; ) { if (!昆布) 買う(昆布); 食べる(昆布) } return 0; }
141 :
デフォルトの名無しさん :2005/04/12(火) 11:24:30
unsigned char hex[16]があります。 これを連結した型で文字列に変換したいのですが、 スマートな方法をアドバイスお願いできないでしょうか? wsprintf( str, "%02X%02X...", hex[0],hex[1] .... ); みたいに作っているのですが長いし美しくないしで。 宜しくお願いします。
>>141 多分そっちの方がスマート。
標準でやろうとするとこうなる。
char buf[33];
int i;
for(i = 0; i < 16; i++)
sprintf(&buf[i * 2], "%02X", hex[i]);
誰か105のdatうpよろしこ
>>141 テーブルつかえ
// strは十分な容量があるものとする
void memdmp(unsigned char *hex, size_t size, char *str)
{
static const char hextbl[] = "0123456789ABCDEF";
int i;
for(int i = 0; i < size; i++) {
*str = hextbl[ hex[i] / 0x10]; str++;
*str = hextbl[ hex[i] % 0x10]; str++;
}
}
一応任意の文字列に対応できる
C言語で簡単なゲーム(テトリスなど)を作りたい場合 基礎文法の習得後になにをやるべきですか?
>>147 ゲームのコードを書いてコンパイルすればよい
俺も基本が終わったところだけど次に何したらいいのかよくわからん
なんでもいいから書け 自分用のソフトを作ってみるとか 他人のソースを改造してみるとか 言語の習得は入り口に過ぎない事に気づく
>>151 したいことが無いなら世間勉強しとけ。
もしくは、世の中でどんな研究がされているのか調べたり、
SF小説で出てきた機能はどうやれば実現できるのかとか考えてみたりしてみたらどう。
私なんか、エレベータ乗るたび、自販機使うたびに、シミュレーションソフトを作りたくなってくるのに。 #暇がないから作りませんが。 ##エレベータのシミュレータといえば、Towerが元々はそう言う目論見だったそうな。 ###古いゲームだから知らんかな。
155 :
デフォルトの名無しさん :2005/04/13(水) 09:21:44
制御系に行く人てやはり理系の電子工学ばりばりの人しかいけないの?
ウェルコーン
158 :
デフォルトの名無しさん :2005/04/13(水) 11:04:34
VMS系のファイルパスで TEST$ROOT:[TEMP.COBOL_SOURCE]C1.COB;2 という内容の文字列を取得してるコードなのですが ディレクトリ終端記号となる"]"以降の ファイル名称を取り出したくおもいます。 "]"の位置を検索してそれ以降を取ればいのだとおもうのですが 何分コボラーなのでCがさっぱりわかりません 助言お願いします。というかズバリ回答のほういただけないでしょうか
159 :
158 :2005/04/13(水) 11:44:02
すみません。もう一つ教えてください VAXではファイル世代を;記号以降で判別するのですが ファイル名称のみを取得するのにはバージョン記号以下が 邪魔となりますので、そこらあたりの除去等もご教授ください よろしくお願いします。
#include <stdio.h> #include <string.h> int main(void) { char s[] = "TEST$ROOT:[TEMP.COBOL_SOURCE]C1.COB;2"; char* p = strrchr(s, ']'); printf("%s", p); return 0; } 初心者だって言うから動くように全部書いてやったけど、 あとのことくらいは自分で調べろ
s/char* p = strrchr(s, ']');/char* p = strrchr(s, ']') + 1; コンパイル通してないんで通るかどうかは保証しない
>>158-159 よく分からんけど、表示だけ。
#include <stdio.h>
#include <string.h>
void print_filename(const char *filepath)
{
const char *start, *end;
// ']' を検索する
start = strchr(filepath, ']');
if (!start) {
// ']' が発見出来なければエラーを出して終了
fprintf(stderr, "[%s] invalid filepath.\n", filepath);
return;
}
// ']' の次を指させる
start++;
// ';' を検索する
end = strchr(start, ';');
// ファイル名を表示する
if (!end) {
// ';' が無ければ終端まで表示
printf("%s\n", start);
} else {
// ';' が存在するなら、その直前まで表示
printf("%.*s\n", end - start, start);
}
}
int main(void)
{
print_filename("TEST$ROOT:[TEMP.COBOL_SOURCE]C1.COB;2");
return 0;
}
>>158 >何分コボラーなので
じゃあ、コボルで書け
164 :
デフォルトの名無しさん :2005/04/13(水) 12:40:59
165 :
158 :2005/04/13(水) 13:01:36
>>160 >>161 >>162 さま。ありがとうございました。
教えていただいた通りにコードを組み込むと
"]"以降の文字列を取得できるようになりました。
セミコロン以降の文字を取得する部分の
printfで負の値が返ってきてるみたいなので
なんとか自力で原因を調べます。ありがとうございました。
166 :
デフォルトの名無しさん :2005/04/13(水) 14:46:46
木の再起呼び出しを利用しての質問です。 struct tnode *output(struct tnode *now) { if(now!=NULL) output( now->left); else{ printf("%s\n", now->name); } if(now!=NULL) output( now->right); return 0; } このように書いたのですが、コンパイルは成功しましたが、 実行時にエラーになってしまいます。 何か指定の仕方がまずかったのでしょうか?
167 :
デフォルトの名無しさん :2005/04/13(水) 14:50:44
書き忘れました。プロトタイプと宣言は以下のとおりです。 struct tnode *output(struct tnode *now) { if(now!=NULL) output( now->left); else{ printf("%s\n", now->name); } if(now!=NULL) output( now->right); return 0; } struct tnode *output(struct tnode *);
168 :
デフォルトの名無しさん :2005/04/13(水) 14:51:52
struct tnode{ struct tnode *left; char name[12]; struct tnode *right; }; 間違えました・・・。
>>166 nowがNULLの時にnow->nameなんてしませんように
>>171 struct tnode *output(struct tnode *now)
{
if(now!=NULL) output( now->left);
printf("%s\n", now->name);
if(now!=NULL) output( now->right);
return 0;
}
これでもだめでした・・・。
なんでこいつはこんなに理解力がないんだろう…
>>172 キミの想定する仕様では、output(NULL) はOKなの? NGなの?
175 :
デフォルトの名無しさん :2005/04/13(水) 16:49:23
>>174 この関数の場合それは必要なことなんですか?
>>175 もちろん。
●output(NULL)がOKな仕様の場合:
output()内でnowがNULLである可能性を考慮する必要がある。
now->left now->rightがNULLがどうかは気にする必要はない。
●output(NULL)がNGな場合:
now->leftとnow->rightがNULLのときは,output(now->left)
output(now->right)を呼んではいけない。
下に示す行列x,y,の積を求めるプログラムを作成せよ。 x[2][3] = { { 1 , 2 , 3 } , { 4 , 5 , 6 } } y[3][2] = { { 1 , 5 } , { 5 , 3 } , { 8 , 1 } } って問題なんですが、for文を使ってやることは分かるんですが、どういう式を書けばいいのかわかりません。 よろしくおねがいします
行列の積の計算方法は分かってるのか?
>>178 わかるんですが、forを使ってどうやればいいのかがわからないんです。
C知ってるのか?
実行者に一次元配列の大きさを尋ね、その大きさの配列を作るには どうすればいいのでしょうか?
malloc
簡単にはできないみたいですね。 メモリ確保とリストを調べてみます。
186 :
184 :2005/04/13(水) 20:26:56
>>185 嘘です、冗談です、はったりです!
本当は、malloc使ってください。
>>182 つまりですね、
a=100;
char* m;
m = (char*)malloc(a*sizeof(char));
で100個のchar型の領域が確保されます。
>>187 ありがとうございます。
char m[5];
m[3]=10;
上と下は同じ処理ができてますか?
char* m;
m = (char*)malloc(5*sizeof(char));
*(m+3)=10;
両方とも m[3]=10; で使えなかったっけ?
>>188 どこに領域が確保されるのか、という議論を無視すれば同じ結果になるでしょう。
あと、*(m+3)という書き方の代わりにm[3]という書き方も許されています。
192 :
192 :2005/04/13(水) 21:36:10
こんばんは。質問です。 @数値を入力 >A 文字列に交換 >B 出力 をしたいです。 Aの文字列に変換する目的は、例えば1000を入力した場合、1,000というように 3桁ごとにカンマを挟みたいからです。 文字列を交換する部分には、 itoa という関数を使用し、 main関数から呼び出そうと考えています。 助力まってます。長々と失礼しました。
で、何を助力してほしいのですか?
194 :
192 :2005/04/13(水) 21:48:50
itoa関数を使って、何桁かの数値を 3桁ごとにカンマで区切って表示する、、、、 プログラムをぶっちゃけ教えてください! 例みたいのがあるとうれしい限りです。
195 :
デフォルトの名無しさん :2005/04/13(水) 21:55:24
とっとと宿題スレへ失せろ 議論してて楽しくねえんだよ *:「ザコめが・・・ つまらん!
>>192 itoaとか面倒なことせずに、ロケール設定しろ。
とりあえずマルチポストをやめることから始めたらいいと思うんだ。
198 :
デフォルトの名無しさん :2005/04/13(水) 22:32:37
クロスポストの手本を見せてくれ
200 :
デフォルトの名無しさん :2005/04/13(水) 23:13:14
scanf("%x"&input_data); としてもプログラムがscanfを無視してしまいます。 コンパイルオプションが悪いのでしょうか? 仕方無いので while(input_data != 0){ scanf("%x"&input_data); } とすると何とか動きますが。
>200 マピロマハマディワロス
祟りだな(((( ;゚Д゚)))ガクガクブルブル
あるバッファを高速にゼロクリアして、さらにゼロになっているかかくにんするプログラムを作りたい けど、とにかく高速に処理をしたいと思っています。 何か良い方法はありますか? とりあえず、今は・・・ 1.先頭のアドレスが4の倍数になるまで1バイトずつゼロクリア。 ゼロクリアの確認はゼロクリアした領域をORして0になっているか確認。 2.先頭アドレスが4の倍数になったら4バイトずつゼロクリア。確認方法は上と同じ。 3.残りの端数をゼロクリア なお2の処理が一番のメインになるのだが、ループしてゼロクリアする際にループの中で処理を展開することで ループ回数を減らしている。 例)10000回のループであった場合、1回のループでクリア処理を10回行い、ループ回数を1000回にする・・・など 一応この方法で300KBのバッファを 昔(普通にループしてクリア)712ms 今(上の処理を利用してクリア)92ms でした。 さらに早くはなるでしょうか?
MMXを使う 又はループをすべてアンロールする
>>203 先ずはマルチポストをやめるのがいいよ。
解っててやってるんだから ツッコんだら負け
>>203 char * buf = calloc(1, 300*1024);
このコードとどっちが早い?
構造体のポインタを宣言するときって、 typedef struct _tagAAA { struct _tagAAA *p }HOGE ; とかって、この時タグ名省略できないと考えているのですが、 もしかして、省略して記述できる方法とかってありますか?
>>194 char *itoa(int n, char *s)
{
char number[] = "0123456789";
int sign = 0, i = 0;
if (n < 0) {
sign = -1;
n = -n;
}
do {
if ((i + 1) % 4 == 0)
s[i++] = ',';
s[i++] = number[n % 10];
} while ((n /= 10) > 0);
if (sign < 0)
s[i++] = '-';
s[i] = '\0';
/* sを逆順にする処理 */
return s;
}
>>211 typedef struct tagHoge HOGE;
struct {
HOGE *next;
} HOGE;
215 :
214 :2005/04/14(木) 11:22:02
間違えたっぽ。こんな感じだと思って流してくれ
前定義識別名の __struct__ を使えば良い。 typedef struct { __struct__ *next; } T;
>>217 ありがとうございます。
僕も勉強になりました。
非標準。
>>211 typedef struct {
void *p;
}HOGE ;
なぜ省略したいと考えるんだろう? 打つのが面倒くさいから?
>>211 これじゃいかんの?
typedef struct tag_DataBlock{
intdata1;
intdata2;
}DATABLOCK,*DATABLOCK;
質問、小数点以下第5位以下を削りたい場合どのようにしたらよい?
10000倍して整数にして小数にして1/10000。
0.00001 で割る。
質問です モンテカルロ法でx*x/4+y*y=1 で表される楕円の面積を求めるというようなプログラムについてです。 このx*x/4+y*y=1というのはどういう公式なのか教えてください。 #include<stdio.h> #include<math.h> #define NUM 1000 double rnd(void); int main(void) { double x,y,s; int i,in=0; for(i=0;i<NUM;i++){ x=2*rnd(); y=rnd(); if(x*x/4+y*y<=1)in++; } s=4.0*(2.0*in/NUM); printf("楕円の面積=%f\n",s); return 0; } double rnd(void) { return (double)rand()/32767.1; }
235 :
234 :2005/04/14(木) 20:04:16
うわ、公式ってなんだよ。 方程式です...orz
236 :
デフォルトの名無しさん :2005/04/15(金) 02:13:57
どこかでC言語のコンパイラはアセンブリ言語のコードも吐いてくれると 聞いた気がするのですが、Borland C++では出来ないのでしょうか? CPADで使ってますがやり方がよくわかりません。 逆アセンブラというのが必要なんでしょうか? hello worldみたいな自分で入力したコードを、 手軽にアセンブラコードで見てみたいのですが…。
コンパイラオプション -S 又は -B でOK。 ついでに、フリーの奴にはTASMが含まれてないので アセンブラソースはアセンブルできない。
238 :
236 :2005/04/15(金) 02:31:03
>>237 即レスありがとうございます!
コンパイラオプションは使ったことがなかったので手間取りましたが、
>bcc32 -S hello.c
でhello.asmファイルが無事出来ました!
ソケットから受け取った 00 1E 84 80 41 41 41 というデータを、 char *data に入れて、最初の4バイトの数字と残りの3バイトの文字列を分離したいのですが、 int suuji = 00 1E 84 80 char moji = 41 41 41 みたいにするにはどうすればいいのでしょうか?
>>239 union {
int i;
char c[4];
} u;
int suuji;
char moji[4];
memcpy(u.c, data, sizeof(u));
suuji = u.i;
memcpy(moji, data + 4, 3);
moji[3] = '\0';
なるほど、memcpy関数を使うのですね。 ご親切にどうもありがとうございましたm(_ _)m
>>233 「x*x/4+y*y=1 で表される楕円の面積を求めるプログラムで
x*x/4+y*y=1というのはどういう公式なのか」
>>234 「楕円の方程式」
(´・ω・`)ナニ? コノ カイワ…
244 :
初心者 :2005/04/15(金) 13:35:58
はじめまして 3次元の画像処理を行いたいのですが、Cで3次元はどのように展開していけばよいのでしょうか? 2次元でしかしたことがなくて、聞く人もいなくて困っています。 よろしくお願いします
マルチだからスルーよろ
>>241 エンディアンが逆なら、memcpy()の代わりに
u.c[0] = data[3];
u.c[1] = data[2];
u.c[2] = data[1];
u.c[3] = data[0];
かな。
或いは、union使わずに
int suuji = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
とか。
>>246 なるほど!
それでもいいんですね。
帰ったらやってみます。
ありがとうございました。
できました! 本当にどうもありがとうございました。 unsignedしてなかったのに255まで入ると思い込んでいたのも出来なかった理由でした〓■●
ちょっと疑問に思ったので質問させてもらいます。 char a = new char[5]; char *b; というように初期化した場合、 a[4] = NULL; は大丈夫そうですが、 b[4] = NULL; とした場合は何か良くないですか?
250 :
デフォルトの名無しさん :2005/04/16(土) 12:04:25
(´・ω・`)C++は知らんがな
>>249 b[4] = NULL;はbがどこを指しているかわからいから何が起こるかわからない。
そもそもNULLはポインタそのものが無効なことを表すのに使う。
だからcharにNULLを使うのは間違い。a[4] = '\0'; b[4] = '\0';が正しい。(さっきの問題でb[4] = '\0';はもちろん正しく動かないが)
252 :
デフォルトの名無しさん :2005/04/16(土) 12:23:08
関数内でヒープからローカルのポインタ変数にメモリブロックを取得して 解放しないで関数から抜ければ 関数を呼ぶたびに解放されない領域が増えて メモリリークするよね?
>>251 そうなんですか。
教えてくださりありがとうございました。
本当に勉強になります。
255 :
デフォルトの名無しさん :2005/04/16(土) 13:00:43
f(x)=x^2+x+1という関数を作って キーボードにnを入力したら、n個のf(x)の値を出力するようなプログラムを教えてください。 例えば3と入力するとf(0)とf(1)とf(2)の値を出力される感じです。
いやだ
>>255 丸投げするなら宿題スレへお逝きなさい。
258 :
255 :2005/04/16(土) 13:17:18
そうします(汗
>>252 関数外で解放していれば、メモリリークは起きない。
メモリリークって何ですか?
>260 >1
メモがリリーク(離陸)すること。
______ |__|__ ___|___ |__|__ │_l__l___ ‐‐┴‐‐ ___ |__|____ │_|__|__| ニニ / ./ | ll ┼─‐ | ├‐ | .| │ |__ |__ ┌‐┐  ̄ヽ / /⌒l | ┼┼、 / T | \ .__| | / | | | _| ノ ._|__ |__ |__| _ノ ヽ__ / し ヽ__ノ ヽ ノ / ○ヽ し (_丿\ .
>>249 >char a = new char[5];
Cにはnewなんてキーワードはありません。
縦しんばC++のつもりだとしても、間違っています。
266 :
デフォルトの名無しさん :2005/04/16(土) 17:07:24
267 :
デフォルトの名無しさん :2005/04/16(土) 18:23:46
(1) if( 普段は起きないエラー処理 ) { エラー処理; } else { 通常の処理; } (2) if( エラーではない ) { 通常の処理; } else { エラー処理; } (1)よりも(2)の方が早いって聞いたんですが、本当ですか?
>>267 どちらが手っ取り早いかは人によるのでは?
269 :
デフォルトの名無しさん :2005/04/16(土) 18:27:39
>>267 よく起こりそうなありそうな方を前にする
(あんまり無い方をelse節にする)
ってのが江戸っ子の生き方、有様
>>267 分岐後の処理が全く違うのにどう比べるつもりなの?
>>267 少なくともそのコーディングスタイルは読みにくい。
そもそも分岐の条件が違うじゃないか。
273 :
デフォルトの名無しさん :2005/04/16(土) 18:32:28
>>268 いや、友達が
if( エラーではない )
{
通常の処理; --------- (a)
}
else
{
エラー処理; ---------- (b)
}
その他の処理; ---------- (c)
return;
とあった場合、CPUは(a),(c)の部分を先読みして、
始めのif文がエラーだった場合に(b)の部分を読むとか言ってたので。
>>269 了解です。ありがとうございました。
したがって、エラー処理とはいえ、処理速度を考えるなら 正常ルートより頻度の高いエラー処理は前に書くのだ でも、普通は見にくくなるから こんなやり方はしない。多分しないと思う。しないんじゃないかな。
例外に処理速度期待するなよ(´・ω・`) 例外が多いならそれは正常系と考えろよwww
実装依存、環境依存
アホが多くて困る。もうね、2chというところは…
頭悪い意見ばかりで見ていて嫌になる。 俺以外にもっとマシな人間はいないのか。
Windows2000/XPのコンソールでエスケープシーケンスを使うのにはどうしたらいいでしょうか? 進捗状況を表示させたいと思っています("%d%", int) この後、前に表示した画面を消去したいと思っています。 printf("\x01b[2J"); みたいな使い方ができるのでしたらお教えください。 // コンパイラ:VC++6 // WindowsXP SP2 機種依存的な質問ですので、スレ違いでしたら誘導願います。
>>272 分岐条件どころか、処理内容そのものが変わってる。
# 1の「普段は起きないエラー処理」を有無を言わさず行うのは如何なものか…
284 :
デフォルトの名無しさん :2005/04/16(土) 19:35:41
>>259 関数外でどうやって解放するのですか?
関数の戻り値の一つに取得したアドレスを埋め込んでおいて、それを解放するとか?
285 :
281 :2005/04/16(土) 19:37:57
>>274 if(p == 0){ // なんかのポインタがゼロだったら
log_err();
return;
}
// 以下、通常処理
とかは普通にやらないか?
>>285 誘導するまでもない。
行の先頭に戻って書き直すだけでいいなら'\r'を試せ。
>>284 だいたいyes
関数の戻り値の一つっていうのがわけわからんが
構造体を返すつもりとか
現実的じゃないね
291 :
デフォルトの名無しさん :2005/04/16(土) 21:31:58
構造体のメンバーに初期値を持たせるにはどうしたらいい?
知ってるけどその態度にムカついたので教えない
俺洩れも。
294 :
281 :2005/04/16(土) 21:42:52
295 :
デフォルトの名無しさん :2005/04/16(土) 22:00:46
俺はC言語初めて3年独学で業務経験ないんだが 今日面接へいったら、いきなり笑われたよ。 家でやってるぐらいじゃ話にならないといわれたよ・・・・ あんなに笑われるとはな・・・
仕事で使ったという実績がないと会社は嫌がるだろ普通 笑うのもどうかと思うが そんなの適当に経歴でっちあげちまえばいいのに まぁ何年やっても使えない奴はいるけど
297 :
デフォルトの名無しさん :2005/04/16(土) 22:17:36
C言語は何を買えばC言語できますか
>>295 >家でやってるぐらいじゃ話にならないといわれたよ・・・・
>あんなに笑われるとはな・・・
レベルの低い会社ほど「趣味グラマ」を嫌う。
これ、常識。
趣味で鍛えられた奴なら、現場にいけば直ぐに分かる。
いわゆる「プロ」のレベルの低さが。
プログラムできても人とのコミュニケーションがとれなきゃ意味ないけどな 口で「3年やってますた」っていわれてもどの程度かわからんし 何かブツでも持っていかないと判断の仕様がない 現に3年やってったってポインタ分かってない奴がいたりするしな
ある程度のレベルまでいってれば、面接の会話だけでも使えそうなやつだとわかるんだけどね。 C言語できますか、なんて会話をしているようでは、あんまり期待できない。
303 :
デフォルトの名無しさん :2005/04/16(土) 22:29:46
面接官がどんな立場の人かは知らないが、常識も余裕もない小者だね 実績もクソも同業者から流れてきた人でもない限りその会社の仕事に関しては素人だろ ちゃんとした人事屋なら見るべきポイントはそんなところじゃなかったはず 数こそ少ないがアマチュアでもプロ並みな人はやっぱりいるし なまじ技量があっても仕事に対する思想が腐ってる奴には会社を任せられない あなたもアピールのしかたがよくなかった 履歴書に書けない能力は現物で見せるとかしないと 単に実務経験なしですが独学してますじゃ通じるわけないよ
304 :
デフォルトの名無しさん :2005/04/16(土) 23:00:10
構造体のメンバーに初期値を持たせるにはどうしたらいいのですか?
struct { int membr1; char member2; long member3; } Hoge = { 1, '2', 3L }
scanfを使った後のgetcharが機能しなくなるのは仕様でつか?
>>306 scanf()の使い方によっては、その通り。
だからscanf()は薦められない。
308 :
デフォルトの名無しさん :2005/04/17(日) 00:48:22
ちゃんと機能してるし それがわからん奴だけが scanf を忌み嫌う おまえらまとめてアフォ
309 :
デフォルトの名無しさん :2005/04/17(日) 00:51:07
scanf使う奴こそアフォ
たぶんscanf の入力形式指定で最後に改行を入れていないんだろ。 そうすると、getcharで改行コード取得して、期待通りの動きにならない。
311 :
デフォルトの名無しさん :2005/04/17(日) 00:53:06
まあ自分が使えないツールを人に薦められないってのは道理だな(プ
>たぶんscanf の入力形式指定で最後に改行を入れていないんだろ scanf("%d\n", &x); とかやるわけ?馬鹿?
趣味グラマもピンキリだからねぇ。 学生の頃からフリーソフト出してたようなタイプは使えるけど、 社会人になって(なぜか)プログラムを始めたとかいう人は変な癖 付いちゃってたりして教え直すのが大変。
業務経験10年ありますなんて言いながら碌なプログラムも書けない香具師を教えなおすよりはまし。
scanf使うのはかまわないが、人に薦める奴は信用しない。
318 :
デフォルトの名無しさん :2005/04/17(日) 00:56:25
ローカル変数はスタックにとられるけど、 初期値つきの変数はdataセグメントにとられる では、初期値つきのローカル変数はどちらにとられるのですか? staticと同じ扱いですか? それともスタックにとって、コンパイラが変数初期化のコードを自動で生成するのですか?
Cの規格的に、dataセグメントなんてあったっけ?
>>318 どのセグメントに何が配置されるかは、Cの規格では規定されていない。
>>318 スタックにとったあと、値を代入。
ある意味初期値とは言えないな。
324 :
デフォルトの名無しさん :2005/04/17(日) 01:06:11
325 :
デフォルトの名無しさん :2005/04/17(日) 01:07:12
>>318 >初期値つきの変数はdataセグメントにとられる
おまえさんがおそらく想定しているであろう処理系でもこれはウソ
326 :
デフォルトの名無しさん :2005/04/17(日) 01:08:06
「一般的な」コンパイラなどというものはない
セグメントって何ですか?
適当に答えると、dataセグメントに定数を配置してそれを毎度スタックにコピーじゃねぇの?
スタックにコピーする必要性は無いような。 つか、スタックにコピーしたらまずいような。
すみません、 「空白の宣言」って何なんでしょうか?
>>330 それだけじゃ誰も何の事か判らないと思うぞ。
>コンパイラの警告 (レベル 2) C4091
>空白の宣言が見つかりました。
>
>ユーザー定義型の宣言の先頭で指定された __declspec 属性は、その型の変数に
>適用されます。このコンパイラの警告は、変数が宣言されていない場合に発生します。
この話ならVC++のスレで訊いた方がいいよ。
>>331 実はちょっといじってたらなおってしまったので、気になってたんです
変数辺りなのは分かってるんですが・・・他スレいってきます。
K&RのアッペンディックスBには,math.hもstdio.hなどと同様に標準ライブラリ関数を含んでいると書かれているので, math.hをincludeしたプログラムをgccでコンパイルするときに-lmを指定しなくても良さそうなのですが, 実際には-lmでリンカにライブラリを指定するのは,なぜなんでしょう. (つまり,リンカからみた場合のmath.hとstdio.hの違いってなんでしょう)
>>333 リンカからはどちらも全く同じ。何故ならば、全く関係ないから。
math.h内で宣言された関数とstdio.h内で宣言された関数の違いなら、
後者はたまたまディフォルトではリンクしないことになっているだけ。
いずれにしても、環境依存なので詳細はunixスレなどの該当スレへ。
335 :
333 :2005/04/17(日) 10:31:55
>>334 ありがとさん
unixスレ行ってきます
336 :
デフォルトの名無しさん :2005/04/17(日) 10:35:50
>>328 dataセグメントからスタックにコピーするくらいなら、リテラルでじゅうぶん
そもそも変数の記憶場所をスタックとdataセグメントの両方に持たせるのは無駄だし、
dataセグメントの意味がない
free( NULL ) ってまずいんですか?
まずくない
free(malloc(1));
#define HOGE(x,y) (((x) > (y)) ? (x) : (y)) と、括弧で囲うのはどういう意味があるのですか? 副作用がどうたらとの、話は聞いたことがありますが、 HOGE(x++,y++); と呼び出した場合、これを防げるわけでもありませんし。
int a, b; HOGE(a = 0, b = 1);
346 :
デフォルトの名無しさん :2005/04/17(日) 22:41:25
| 〜〜〜〜〜〜〜〜|〜〜〜〜〜〜〜〜〜〜 | >( c´_ゝ`) | J >( c´_ゝ`) >( c´_ゝ`)
347 :
デフォルトの名無しさん :2005/04/17(日) 22:43:18
kansu(){ char *a,*b; // ★ここから a = malloc(1024); if(!a)return; b = malloc(1024); if(!b){free(a);return;} // ★ここまで //処理 free(b); free(a); } 上の部分、上手に書きたいんだけど、 この書き方だとなんか野暮ったい もうちょっとだけスマートに書きたい
349 :
デフォルトの名無しさん :2005/04/17(日) 23:18:46
>>348 スマートとは言いがたいが、こんなのはどう?
void kansu() {
char *a = 0, *b = 0;
if (!(a = malloc(1024)) || !(b = malloc(1024))) {
free(a);
free(b);
return;
}
/* 処理 */
free(b);
free(a);
}
351 :
348 :2005/04/17(日) 23:35:05
>>349 すまん。パス。それならgoto使った方がいいと思ったりした。
でもgotoもちょっとアレだし・・・
>>350 それだと、あれかなるほど
aのmallocで失敗した時点でif抜けるからbまでmallocすることはないのか
free(0)って何もしないって規定されてたか。そういえば。なるほど。
352 :
348 :2005/04/17(日) 23:36:38
いや、これがmallocだけなら a=malloc(2048); b=a+1024; みたいなのも考えたんだけど これがmallocじゃなくてなんかのオブジェクト生成だったら 結局似たコードになるよね っていう感じで じゃあどうしよう、という・・・
…if抜けるか?
354 :
デフォルトの名無しさん :2005/04/17(日) 23:39:14
void kansu() { char *a = 0, *b = 0; a = malloc(1024); if (!a) goto End; b = malloc(1024); if (!b) goto End; /* 処理 */ End: if (b) free(b); if (a) free(a); }
355 :
348 :2005/04/17(日) 23:48:30
>>353 抜けるって思い込んでた。違ったらごめん。
>>354 やっぱそれしかないのかな・・・
例じゃ省略してたけど、エラー時にログをとるようにしてると
最後にジャンプするような形を取ると、関数を抜けるときに
またごちゃごちゃしちゃう気がしてちょっとアレだった。
356 :
デフォルトの名無しさん :2005/04/18(月) 00:09:22
void kansu() { char *volatile a, *volatile b; a = malloc(1024); if (!a) goto Fail_a; b = malloc(1024); if (!b) goto Fail_b; /* 処理 */ Fail_b: if (b) free(b); Fail_a: if (a) free(a); }
>>355 最後にジャンプする前にログ記録するのはだめなのか。
358 :
デフォルトの名無しさん :2005/04/18(月) 00:13:46
>>356 volatileを省略するとどうなるの?
359 :
デフォルトの名無しさん :2005/04/18(月) 00:15:33
>>358 どうもならない
【本当に】 goto を使っている限り
>>359 それは、volatileの有無とは関係ない話だろ。
361 :
348 :2005/04/18(月) 01:10:52
>>357 冷静に考えたら それで十分だね。 うっへっへ
kansu(){ char *a,*b; a = malloc(1024); if(a){ b = malloc(1024); if(b){ //処理 } } if(b) free(b); if(a) free(a); }
kansu() { char *a,*b; a=b=NULL; if((a = malloc(1024))&&(b = malloc(1024))) { //処理 } free(b); free(a); } 普通にこれでいいんじゃないの?
>>362 は ×。
わざとなのかもしれないけど。
365 :
デフォルトの名無しさん :2005/04/18(月) 12:57:02
double 型の変数で余りの計算ができないのは どうしてなのですか?
div() ldiv()
C99でいいなら remainder系だろうな
>365 余るのか?
5.5%2.5 = 0.5 になって欲しいんじゃないの?
>>365 なんで % 演算子じゃなく fmod なんて関数にしたか、って話なら
…俺は知らん。なんでだろね?
% 演算子は 「整数」 剰余だからだろ オペランドが整数か浮動小数点数化で結果が変わる演算子(・A・)イイ!!イクナイ
> (・A・)イイ!!イクナイ どっちだよ orz
C言語を始めたいのですがどこから入ればいいですか?? もし、本から入るのが良いのならどの本が分かりやすくて 理解できますか???
>>375 言い直そう。
「加減乗除の演算子は整数・実数構わず使用できて
なんで剰余は整数限定なのさ」
>>377 じゃあ聞くが、浮動小数でなんで剰余が必要なんだよ
擦違いですいません。
>>378 …お前、ちょっと黙ってろ。他の人に訊いてんだから。
>>381 じゃぁ聞くが、浮動小数点数における剰余を演算子でしなければならない理由は?
>>381 はいはーい、他の人やってきましたー
それはですねー ずばり!必要ないからです〜〜〜
整数の四則演算もみんな関数にしようよ。 int add(int, int); int sub(int, int); int mul(int, int); int div(int, int);
int add(int x, int y) {return x + y;}
int sub(int x, int y) {return x - y;}
double mod(double x, double y) {return x%y; }
>>385 div()は標準ライブラリに存在する。
構造体div_tを使って商・余を同時に返す。
Cの動作条件としてよく動作メモリサイズを聞かれるのですが、 これを簡単に計測する方法はないでしょうか?
391 :
デフォルトの名無しさん :2005/04/18(月) 21:48:42
簡単にって時点で解なし
>>378 余りを知りたいときじゃない?
fmodなんていう関数もあるんだし、そういう需要はあるんでしょ。
#include <stdio.h> #include <conio.h> #include <math.h> main(void){ double a, b, c, d, e, f, g; scanf("%lf %lf %lf %lf",&a, &b, &c, &d); printf("a=%.4f\n b=%.4f\n c=%.4f\n d=%.4f\n",a, b, c, d); e = a / b ; f = c / d ; g = e + f ; printf("e=%.4f\n f=%.4f\n g=%.4f\n",e, f, g); printf("end"); getch(); } 上記のプログラムにおいて、e,fで得られた値を小数点第4位まで表示されますが、 その値(即ち、小数点第4以下を切った値)をgの式に代入するにはどうすればよいでしょうか? e=0.00365→0.0036 f=0.23451→0.2345 g= 0.0036 + 0.2345
>>394 10000 倍して floor() 呼んで 10000 分の 1 にする。
正確にやりたきゃ他の計算ライブラリ使うしかないな
398 :
デフォルトの名無しさん :2005/04/19(火) 00:32:30
C言語でのDinic法のアルゴリズムを探しているのだが、どこにありますかな?
>>398 あんたの探してるモノは多分 「アルゴリズム」 じゃない。
なるほど、
>>399 みたいな奴のせいでこの板は初心者に閉鎖的なのか。
アルゴリズムが解かったら実装できるやん。なんでやらないの?
文法を全て覚えてからやっと初心者が名乗れるんだけど、それすらもできていない奴はまず文法を覚えろ。
俺はオナニーに忙しい。お前に構っている暇はない!!!
406 :
デフォルトの名無しさん :2005/04/19(火) 03:07:36
下の無向グラフの探索プログラムを有向グラフ対応のものに改良を加えたいのですが どうすればいいでしょうか? #include <stdio.h> #define N 8 int a[N][N]= {{0,1,0,0,0,0,0,0}, {1,0,1,1,0,0,0,0}, {0,1,0,0,0,0,1,0}, {0,1,0,0,1,0,0,0}, {0,0,0,1,0,1,0,0}, {0,0,0,0,1,0,1,1}, {0,0,1,0,0,1,0,1}, {0,0,0,0,0,1,1,0}}; int v[N]; void visit(int i){ int j; v[i] = 1; for(j=0; j<N; j++){ if(a[i][j] == 1 && v[j] == 0){ printf("%d->%d ",i,j); visit(j); } } printf("\n"); } int main(void){ int i; for(i=0; i<N; i++) v[i]=0; visit(0); return(0); }
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
408 :
デフォルトの名無しさん :2005/04/19(火) 03:17:41
>>407 ソース丸投げのスレタイがわかりませんが
409 :
デフォルトの名無しさん :2005/04/19(火) 03:25:34
あ、表現が悪かった。
>>407 宿題、書籍のスレは調べりゃすぐにわかりますが、
ソース丸投げのほうのスレのスレタイが分かりません。
それ1行で済ますんだったら、
>>1 に誘導スレ貼るなりしてくださいな。
410 :
デフォルトの名無しさん :2005/04/19(火) 06:32:36
たぶん宿題スレだと思う
return に () が付いている本とかたまにありますが、 あれが意図するところは何なのですか? ただ単に、その人がその方が綺麗とおもうからでしょうか?
なるほど
古代のコンパイラではreturnに()が必要だったらしい。
unsigned char abc[100]; のような配列変数の、abc[x]の場所に、int型(2byte)の値を abc[x] = int型の上位1byte abc[x+1] = int型の下位1byte という結果になるように代入したいのですが、 上位と下位に分けて2回代入するのではなく、 一回の代入だけで入れる方法はありますでしょうか。 キャスト等、方法は何でもよいです。 目的は、見た目その他から、一行に収めたいからです。
>>415 見た目・わかりやすさから、
二回に分けて代入した方が良いと思う。
共有体とか使ってみれば?
>>415 エンディアンの違いがあるから、確実に行うのならば2行に分けたほうが懸命
っていうか、割と環境に依存するから
421 :
デフォルトの名無しさん :2005/04/19(火) 22:09:54
volatile修飾子ってさ 結構使ってる?
424 :
デフォルトの名無しさん :2005/04/19(火) 22:31:20
俺のプログラム遍歴をみてくれ C→Java→perl→PHP→C++→C#→C 現在はCに戻ってる。正しい道を教えてくれ
426 :
デフォルトの名無しさん :2005/04/19(火) 22:36:37
*********** ********* ******* ***** *** * 上から左右2個ずつ*が減る逆三角形を作りたいのですが、for文の条件がわかりません。 *を増やすのを2個ずつ減らせばいいのは分かるのですが、m=m+2にすると、 平行四辺形になります。どうかヒントだけでもいただけないでしょうか #include <stdio.h> void main(void){ int k,l,m; for(k=1;k<=6;k++){ for(l=1;l<=k;l++){ printf(" "); } for(m=1;m<12;m=m+2){ printf("*"); } printf("\n"); } }
>>424 正しい道など無い。必要な時に適切な言語を使うだけのことだ。
解くべき問題の性質にあわせて言語を選ぶ事が肝要なのだから、
一つの言語に依存した考え方よりもより一般化して考える事が重要になってくる。
430 :
デフォルトの名無しさん :2005/04/19(火) 22:38:53
あぁ空白が消えてるよ・・
あ、スレ違いでしたか。失礼しました。ではそちらに行ってみます
>>426 void pa (int n) { if (n == 0) printf ("\n"); else {printf ("*"); pa (n-1);}}
void pt (int n) { if (n <= 0) return; else {pa (n); pt (n-2);}}
int main (void) {
pt (11); return 0;
}
433 :
デフォルトの名無しさん :2005/04/19(火) 22:52:21
>>432 間違っていたら
_____
二 ∠ __|_ |_|_|_| .|二| 立 ノ _ツ_
= |二|ヽ| 二| |二 レ' |二|┌┐ | | ロ | 女
口 才 _| フ ├‐ (_ ハ |__| | 貝 (_
┬┬
|工工| __|__ヽ
‐┼┬‐ ヽ | / ┼ _フ
く_ノ .ノ | ヽ_ 9 o)
 ̄フ 〃
 ̄ ̄フ
(_
再帰を使えばかっこいいと思ってるのか
for(m=1;m<(14-k*2);m++){
printf("for判定で四則演算カコワルイ");
void pa (int n) { if (n == 0) printf ("\n"); else {printf ("*"); pa (n-1);}} void pt (int n, int m) { if (n <= 0) return; else {printf("%*s",m,""); pa (n); pt (n-2, m+1);}} int main (void) { pt (11, 0); return 0; }
>>434 再帰の方が保守性が高いと本気で思ってる
439 :
426 :2005/04/19(火) 23:00:05
>>435 行きました!ありがとうございます!m(__)m
もっとがんばりますッ
初期値付きのローカル変数だけど 手持ちのクロス環境でobjdumpを調べたら スタックにとって初期値を代入してた それにしても最適化はすごいな main(){ int i0=0,i1=1,i2=2,i3=3,i4=4,j,k; for(j=0;j<4;j++){ i0++; i1++; i2++; i3++; i4++; } k=i0+i1+i2+i3+i4; } とやったら、kに30がダイレクトに足されてた これくらいだと、コンパイラが計算しちゃうんだな
どう最適かしたのか、オプションは。バージョンは。
443 :
デフォルトの名無しさん :2005/04/19(火) 23:20:51
Cでメモリがほんとにわかっているやつは果たして何人いるんだろうか くそめためたな入門書を読むたびにそう思うよ
>>442 コンパイルオプションなし
バージョンは会社のPCなので今調べられない
volatileつけたら、律儀にソースのとおりにやってて
なんか微笑ましかった
>>445 だろうね、ポイントはfor文の中身だよ、
ループ回数が判定できる構造になっているのがミソ
しかも4回と小さいので、コンパイラはまず、ループを展開しようとして、
それから計算の依存関係をしらべて、即値として結論している。
>>441 そこまでコンパイラが賢いなら
i0,i1,i2,i3,i4は全部スタックにとる必要がないんじゃないか?
英語の試験で意訳しすぎて×もらったの思い出した。
449 :
デフォルトの名無しさん :2005/04/20(水) 13:44:37
やっぱりプログラマを目指すならアルゴリズム を勉強するのは必須かな?
>>449 プログラマは目指すものじゃない、なってしまうものだ。
こんな廃れた言語使ってる奴って池沼しかいないだろ。 オブジェクト指向のVBが最強だってのに。
C++を学ぶ準備としてCを使えるようになろうとする奴は結構いると思う。 直接C++やればいいのに。
うん、でもVBには敵わないけどね
ならVBはC++に対してどんな点で敵わないの?
>>455 ・C++と違って何と言っても小さいファイルサイズ
(ランタイムファイルがなくとも動くソフトは作れる)
・C++と違って参考書類が豊富
・C++と違ってAPIからのルーチン群の取り込みが容易
>>461 灯台もと暗しorz
馬鹿すぎました…
トンクス
463 :
デフォルトの名無しさん :2005/04/20(水) 20:38:34
JIS=有料という感覚は正しい
464 :
デフォルトの名無しさん :2005/04/20(水) 20:53:22
質問です 2chブラウザを自動的に立ち上げてくれるプログラムを作りたいのですが C言語でアプリなどを開く関数ってありますか? DOSで言うstartのようなのです
>>464 DOSで言うstartというのは、バッチコマンドのstartのことか?
それならsystem()で起動できる。
467 :
デフォルトの名無しさん :2005/04/20(水) 21:05:29
>>465 あったんですね!!
有難うございます
とりあえずどのヘッダファイルか調べてきます
分からなかったらまたきます
468 :
デフォルトの名無しさん :2005/04/20(水) 21:05:50
469 :
464 :2005/04/20(水) 21:21:04
キタ━━━━━━(≧∀≦)ノ━━━━━━ !!!!! できたできた ありがとん!!!
470 :
デフォルトの名無しさん :2005/04/21(木) 12:43:17
void hoge( void ) ; void hoge( void ) ; void hoge( void ) ; void hoge( void ) ; void hoge( void ) ; とかって、プロトタイプ宣言たくさんしても警告すら出してくれないのですが、 どうすればいいですか?
472 :
デフォルトの名無しさん :2005/04/21(木) 13:35:10
return 0って何ですか?
戻り値が0
474 :
デフォルトの名無しさん :2005/04/21(木) 13:53:37
main関数の戻り値は0でないとだめ?
だめじゃないよ
476 :
デフォルトの名無しさん :2005/04/21(木) 14:06:57
C言語の本にはreturn 0とある。main関数に戻り値は必ず必要?そしてそれは整数?
>>476 規格に則っているなら必要。そしてそれは整数。OSによっては0以外を返すと一々警告が出るので必要がないなら0を返すべき。
但し、C99はなくてもいいことになってたんじゃないかな。
勝手につけてくれるだけだろ
479 :
デフォルトの名無しさん :2005/04/21(木) 14:59:59
>477 C99って何ですか?
>>479 規格の一種
JIS ISO C99
でググれ
481 :
デフォルトの名無しさん :2005/04/21(木) 15:31:17
c++にもtryブロックがあると聞いたのですが。 tryが認識されません。 設定の例外処理もちゃんと有効にしているのですが。 もしかして、なにかincludeしないといけないのでしょうか? ちなみに私はVCコンソールアプリケーションでやっています。
c++
483 :
デフォルトの名無しさん :2005/04/21(木) 15:44:34
すみませんスレ違いでした。
malloc/freeがスレッドセーフかどうかは決められていないんでしょうか
大学でC言語のソースをVC++でコンパイルするのですが、 コマンドライン引数を使用するにはどのようにすればよろしいのでしょうか? そのまま実行しても入力できずにエラーが返ってきます。
コンソールアプリケーションで作ってる?
K&Rの本はint main(void)じゃなくてmain()だからカスですか?
>>488 うわ・・・痛い人だ
意味わかってます?
>>484 「スレッド」という概念が標準にありません。
494 :
484 :2005/04/21(木) 21:42:42
>>492 やっぱりそうですよね
当然割り込みに関して安全かどうかもわからないですよね
マニュアルみるしかないか
昔、「情報処理演習2」の授業を取ったんです。「情報処理演習2」 そしたらなんか人が結構いたけどまぁ座れたんです。 で、始まってみたらなんかC言語をやるんです。 もうね、アホかと。馬鹿かと。 お前らな、C言語如きで普段来てない土曜日に来てんじゃねーよ、ボケが。 C言語だよ、C言語。 なんか友達連れとかもいるし。友達4人でC言語か。おめでてーな。 よーし漏れプログラム書いちゃうぞ―、とか言ってるの。もう見てらんない。 お前らな、答えやるからその席空けろと。 情報処理演習2ってのはな、もっと殺伐としてるべきなんだよ。 隣の席に座った奴といつ喧嘩が始まってもおかしくない、 刺すか刺されるか、そんな雰囲気がいいんじゃねーか。女子供は、すっこんでろ。 で、やっと授業が始まったかと思ったら、教科書に、main() {とか書いてあるんです。 そこでまたぶち切れですよ。 あのな、main() {なんてきょうび流行んねーんだよ。ボケが。 得意げな顔して何が、 main() {だ。 お前は本当にmain() {で良いのかのかと問いたい。問い詰めたい。小1時間問い詰めたい。 お前、とりあえず動けばいいだけちゃうんかと。 C言語通の俺から言わせてもらえば今、C言語通の間での最新流行はやっぱり、 ANSI、これだね。 int main(void) {これが通の書き方。 (void)ってのは引数が無い事を明示している。そん代わり文字数が多め。これ。 で、それに帰り値がint。これ最強。 しかしこれを書くと次からANSI非準拠の旧世代のCコンパイラを通らないかもしれないという危険も伴う、諸刃の剣。 素人にはお薦め出来ない。 まあお前らド素人は、VBでもやれってこった。 まぁ、先生自体が動的リンクとか知らなくて-lmオプション付けてコンパイルすると 実行ファイルのサイズが馬鹿でかくなります。とか平気で言ってたしなー。
>>495 あーあ。恥の上塗りしなくていいのに。どうしようもない人間だな。
>流行 ン年前の?
498 :
デフォルトの名無しさん :2005/04/21(木) 22:28:42
質問です。 int a=1, b=2, c; c = a+b;/* OK(c==3) */ c = a++b;/* Error */ c = a+++b;/* OK(c==3) */ c = a++++b;/* Error(以下エラー) */ となるのですが、どうしてでしょうか? a++b → a+(+b) a++++b → (a++)+(+b) a+++++b → (a++)+(++b) と解釈する余地はあると思うのですが、コンパイラはそう解釈しないようです。
最長一致
>と解釈する余地 ない 前から順番に + ++ だけ
502 :
500 :2005/04/21(木) 22:38:13
>501 知らなかったorz
504 :
デフォルトの名無しさん :2005/04/21(木) 22:53:11
メモリの使用状況を調べたいので メモリ割り当て関数を定義して void* orig_malloc(size_t size) { #define DEBUG /* 色々情報を仕込む*/ p=malloc(sizeof(メモリ管理構造体)+size); return p?p-sizeof(メモリ管理構造体):NULL; #else return malloc(size); #endif } てな感じで使っています 不正なメモリの使い方(二重にfreeとか)した時に 呼び出し元の関数を表示したいのですが、 いいアイディアが浮かびません ・orig_mallocのインターフェースを変えて__LINE__とか__FUNC__を仕込む 例)orig_malloc(size_t,const char*,const char*); 欠点:クライアントコードの変更が多数発生する上に メモリ確保の度にいちいち情報渡すのが面倒 ・スタックフレームの内容を調べる 欠点:環境に依存すると思われる 何よりやり方がよくわからない 皆さんはどうしてます?
kansu(){ char *a,*b; // ★ここから a = malloc(1024); if(!a)return; b = malloc(1024); if(!b){free(a);return;} // ★ここまで //処理 free(b); free(a); } a = malloc(1024); b = malloc(1024); if(a && b){ //処理 } if(b) free(b); if(a) free(a); でいいんじゃ?
>orig_malloc マクロに汁 __LINE__とか__FUNC__を渡せるやつは別の名前に!
>>504 #include <stdio.h>
void* malloc_debug(std::size_t x, const char* f, int l) {
std::printf("%d %s %d\n", x, f, l);
return malloc(x);
}
#define malloc(x) malloc_debug(x, __FILE__, __LINE__)
int main(void) {
char* p1 = (char*)malloc(1);
char* p2 = (char*)malloc(1);
char* p3 = (char*)malloc(1);
free(p1); free(p2); free(p3);
}
508 :
504 :2005/04/21(木) 23:19:40
>>506 >>507 おぉ!なるほど
mallocをマクロで上書き?するのに軽い罪悪感を感じますが
orig_mallocを同じ様にすれば無問題すね
ありがとんです
a > 9 ? b = 0 : 0 ; ってな具合に三項演算子のelse に当たる部分で何もしたくない時、 : 0 ってやってますが、他になにかもっとスマートというか、そんなやりかたないですか?
>何もしたくない時 すなおに if() で掻けや(w
?とか使いたかったです。
おぉ・・・そんな手があったとゎ。
なんかperlとかシェルスクリプトみたいだな
今まで何気なく構造体を初期化するとき、 struct hoge a = { 0 } ; としていました。自分が所持しているコンパイラでは全部0で初期化 されるのですが、これは配列と同等で、保障されているのものなのでしょうか?
されてます
構造体のメンバによるんじゃ? double とかって大丈夫だったっけ
もし何かのヘッダファイルのインクルードを失敗したら、 とかって、条件分岐させたいのですが、大体ファイルの先頭のインクルードガード #ifndef __XXX_H__ #define __XXX_H__ : #endif どれ見てもこの形式になっているように思いますが、 これは規格とかで決まっているものなのですか?
>>519 失敗したときに条件分岐できるのか?
コンパイルエラーになるだけじゃないの?
>これは規格とか ってゆーか知恵だ 同じヘッダファイルを何度もincludeして何度も定義しないようにするため
なんというか、この #define __XXX_H__ 定義の、 __XXX_H__
アンダースコア2個、ファイル名、H、アンダースコア2個という
命名規則があるのかなぁ、と思ったです。そうしたほうがやりやすそうな気がして。
>>520 さんがおっしゃるよう、確かにそうですね_| ̄|○
どうか聞き流してください。
>>519 先頭がアンダーバーで始まる名前は使うな。
わかりました。
526 :
デフォルトの名無しさん :2005/04/22(金) 01:04:53
よく思い出したら、お礼書いてなかった。 レスありがとうございましたです!
俺は #ifndef FILENAME_H_INCLUDED ってしてる
俺は #ifndef NULLPO ってしてる
529 :
デフォルトの名無しさん :2005/04/22(金) 09:06:25
プログラミングの仕方ってどうやるんですか? #include 〜をメモ帳に書いたんですが、それの実行させる仕方が分りません。 基本的なことですがお願いします。
530 :
デフォルトの名無しさん :2005/04/22(金) 09:47:58
531 :
デフォルトの名無しさん :2005/04/22(金) 10:28:52
>>530 本当に分からないんですorz
今C言語の本読んでるんですが分かりません
>>531 選んだ本が悪かったね
まずは
>>1 以下のテンプレ読んでおいで
あとgoogleで「c言語 入門」とか検索すれば出てくる
自分で調べるクセをつけておくと、今後役に立つので、がんばれ
本のせいにするなよ
534 :
dふぁs :2005/04/22(金) 11:14:36
#include <stdio.h> #define MAXLINE 1000 void reverse(char from[], char to[]); int getline(char s[], int lim); int main() { char line[MAXLINE]; char rline[MAXLINE]; int len; while ((len = getline(line, MAXLINE))>0) { reverse(line,rline); printf("%s", rline);}} int getline(char s[], int lim) { int c,i; for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++ i) s[i] = c; if (c == '\n') { s[i] = '\n'; ++i;} s[i] = '\0'; return i;} void reverse(char from[], char to[]) { int i,j; for (i = 0; from[i] != '\0'; ++i); for (j = 0, i--; i <= 0; ++j, --i) to[j] = from[i]; to[j] = '\0'; return ;} ↑を実行するとセグメントエラーと出ます。 セグメントエラーってなんですか?
>>534 > セグメントエラーってなんですか?
メモリアクセスのエラーだと思われ。
俺様が添削してやったからありがたく思え。
>printf("%s", rline);
printf("%s\n", rline);
>if (c == '\n') {
> s[i] = '\n';
> ++i;}
ばっさり削除。
> for (j = 0, i--; i <= 0; ++j, --i)
for (j = 0, i--; i >= 0; ++j, --i)
あはは、エピたんに怒られてやんの。
538 :
529 :2005/04/22(金) 13:01:55
すいません、もう1つお願いします。 自分が言ってたのはコンパイルするってことですか?
>>538 スレ違い、いや板違いかもしれん。
頼むから日本語で質問してくれ。できれば初心者スレで。
急速にスレの質が低下してまいりました
543 :
200 :2005/04/22(金) 16:17:26
急速にスレの質が低下してまいりました
所詮Cグラマだし
546 :
デフォルトの名無しさん :2005/04/22(金) 16:35:39
_ ∩ ( ゚∀゚)彡 ちんこ!ちんこ! ⊂彡
547 :
546 :2005/04/22(金) 16:36:41
すまん、誤爆した。
流れにふさわしい誤爆じゃ
549 :
デフォルトの名無しさん :2005/04/22(金) 17:50:36
すいません、よく分からないので教えてほしいのですが、、、 文字列データの2次元配列へのポインタテーブルを定義したいのですが、 char char_tbl00[][32] = { "abcde", "fghrjk", "lmnopq", }; char char_tbl01[][32] = { "112233444", "66778899", "10101010", }; って文字列テーブルがあって、 このテーブルのポインタテーブルを定義の仕方が分かりません(T_T) ↓こうかなぁと思ったのですが、エラーが出てしまいます、、、。 char (*)[32]char_list_tbl[] = { char_tbl00, char_tbl01, }; どのように定義したらいいでしょうか、、、? 分かる人いましたら、よろしくお願いしますーm(__)m
>>549 char (*char_list_tbl[])[32]
551 :
549 :2005/04/22(金) 19:13:05
>>550 なんでそーなるのか答えを見てもサッパリ分からないけど、やってみたら出来ました。
ありがとう。
お前が最高に輝いて見えるよ。。。
急速にスレの質が低下してまいりました
>550 エラー出るよ...
dejavu?
d?Pj?A vu
炎の杖で書いとけば消えないよ
560 :
デフォルトの名無しさん :2005/04/22(金) 22:59:30
malloc()で2次元配列を確保したときのポインタの使い方について質問です。 #include<stdlib.h> #include<time.h> #include<stdio.h> int main(void) { unsigned char** cp; int i, j, w = 4, h = 4; srand(time(NULL)); cp = (unsigned char**)malloc(h * sizeof(unsigned char*)); for(i = 0; i < h; i++) cp[i] = (unsigned char*)malloc(w * sizeof(unsigned char*)); for(i = 0; i < h; i++) { for(j = 0; j < w; j++) { *((*cp + j) + i) = rand() % 11;// ここでランダムな数を入れたい printf("%d\t", cp[i][j]); } printf("\n"); } for(i = 0; i < h; i++) free(cp[i]); free(cp); } 4 X 4の2次元配列に1〜10のランダムな数を代入したいのですが、上の書き方だと うまく入ってくれません。 よろしければどなたかよろしくお願いします。
1+rand()%10
>>560 >*((*cp + j) + i)
よく見てないけど、*(*(cp + j) + i) じゃない?
cp[j][i] の方がいいと思うけど。
>>560 - cp[i] = (unsigned char*)malloc(w * sizeof(unsigned char*));
+ cp[i] = (unsigned char*)malloc(w * sizeof(unsigned char));
- *((*cp + j) + i) = rand() % 11;// ここでランダムな数を入れたい
+ *(*(cp + i) + j) = rand() % 11;// ここでランダムな数を入れたい
565 :
デフォルトの名無しさん :2005/04/22(金) 23:30:28
>>529 全くの初心者ですな
まずは
http://www9.plala.or.jp/sgwr-t/を最初から最後まで読むこと #include < >は<>内のヘッダファイルを読み込むことだ
これから使う関数の定義は<>内のファイルに書き込まれていますよ、ってこと
つまり#includeしないでprintfなどを使っても、コンピュータはprintfって何?って思うわけで
コンパイルはソースをマシン語に翻訳すること
今書いてるソースは人間には理解できる言葉で書いてるだろ
例えば a = 1 + 3; これを見たら、ああ aは4になるんだなって分かるけど
コンピュータはそれを見ても分からない
だからコンピュータ語に翻訳してやる
それがコンパイル
566 :
デフォルトの名無しさん :2005/04/22(金) 23:44:52
#include <stdio.h> #include <stdlib.h> int main( void ) { inti; charfuck[] = ":A\nstart \"俺様にひれ伏せ\" echo 俺様にひれ伏せ\ngoto A"; charout[20] = "out.bat"; FILE *fpout; /* 出力ファイルのオープン */ if( ( fpout = fopen( "fuck.bat", "w" ) ) == NULL ) { printf( "運がよかったな!ファイルが作成できません。--- fuck.dat\n" ); exit(1); } /* データの入力 */ fprintf( fpout, "%s", fuck); /* ファイルのクローズ */ fclose( fpout ); /*デンジャラスタイム発動*/ system(out); return 0; } /*お前等これを*.cにコピペしてコンパイラして実行してみやがれ*/
567 :
デフォルトの名無しさん :2005/04/22(金) 23:46:57
やべ TABが消えてる
printf("10000: %d\n",10000-(12*9+15*7)*1.05); と int total; total = (12*9+15*7)*1.05; printf("10000: %d\n",10000-total); で上は−856993459と出力されてしまい 下は正しく計算されるのですが↓の警告が出されます >>warning C4244: '=' : 'const double' から 'int' に変換しました。データが失われているかもしれません。 いろいろ試して*1.05が何かおかしいみたいなんですが、totalの部分はコピペなのになんで違ってしまうんですか?
569 :
デフォルトの名無しさん :2005/04/22(金) 23:55:22
int型に小数点付けようとしてるからだ
> printf("10000: %d\n",10000-(12*9+15*7)*1.05); printf("10000: %f\n",10000-(12*9+15*7)*1.05);
571 :
568 :2005/04/23(土) 00:37:00
>>569 即レスどうもありがとうございます。とりあえず↓なようにして小数点を削ってみたらちゃんとできました。
printf("10000: %d\n",10000-(12*9+15*7)*105/100);
これからlong intやfloatの使い分けを理解しようと思います(そういう問題じゃないのかな
どうもありがとうございました
572 :
568 :2005/04/23(土) 00:40:17
>>570 さんもありがとうございます
やっぱり%fや%dの部分なんですね
調べるのにすごい時間がかかってしまいました^^;
けちけちするな。_int64使え。
すみません、質問なんですけど ここの部分の判定がなされてないみたいなのですが if(a == b == c)printf("0000"); 書き方がおかしいのでしょうか?
>>575 if (a==b&&a==c) …
==演算子は二項演算子だ。
(a==b) && (b == c) じゃだめなんすか?
>>580 577は僕じゃないです。^^;
コンパイル通りましたんで、関係演算子と論理演算子を研究してみたいと思います
ありがとうございました
>>581 それよりももっと重要で汎用的な知識として型理論も研究した方がいい。
ヒント (a == b) == c
モノレールの阪大病院前と阪急の北千里、 どっちで降りたほうが道が分かりやすいですか?
それに阪急の方がやすいし。
つぎ。
以下、矢印キーを押されたら、hello と表示されるプログラムです。 #include<stdio.h> #include<conio.h> int main( void ) { char c = '\0' ; while( c != '\r' ) { c = getch() ; switch( (unsigned char)c )//わざわざキャストがいる。 case 0xE0://上でキャストをしない場合ここが-32 だとOK printf( "hello." ) ; } return 0 ; } コメントにも記述してあるよう、わざわざキャストが必要なのはなぜなのでしょうか? どちらも内部的には同じ 0xE0 だと思っていたのですが。
>>591 signedなcharはintにキャストされると0xffffffe0になる。それは即ち、-32。
おぉ、すばらしい。 ここで訊いて正解でした。ありがとうございます。
「プロジェクトを完了させてから事故死」 とか書いてもきっとすぐに心臓麻痺で死ぬんだろうな。
なんで始めからintで受けないの?
>>591 case '\xE0':と書けばcharがsignedかどうか気にする必要がなくなる。
NaNって何ですか? どこに定義されてるんですか?
NaNとジョー先生
601 :
デフォルトの名無しさん :2005/04/23(土) 19:56:35
だじゃれだろ、笑ってやれよ
はっはっはっ
#define ADD( m , n ) ( (m) + (n) ) のようなマクロ関数を使うとき、(m,n) という具合に、スペースは入れないほうが よいと教えられました。では逆にスペースをいれることによって起こり得るバグとは どのようなものがあるのでしょうか? 考えても思いつきません。
>>603 まずは
入れるなと言った奴に
聞いて来い
605 :
デフォルトの名無しさん :2005/04/23(土) 22:41:05
入れるなと 言った奴に 聞いたとて 彼もまた 誰かに聞いて そうしてる
低脳の螺旋だな
>>603 バグが起こるとかそういう問題ではない。単にお前の空白の置き方が不自然なだけ。
ちなみにこれが俺流。比較的広く通用すると俺は思っている。
#define ADD(m, n) ((m) + (n))
609 :
デフォルトの名無しさん :2005/04/23(土) 23:01:19
#define ADD (m,n)((m)+(n)) (゚∀゚)アヒャヒャヒャ
手動で貼り付ける意味がわからない
613 :
デフォルトの名無しさん :2005/04/24(日) 03:46:01
これのどこらへんが危険なのですか? main(int argc, char *argv[]) { printf(argv[1]); }
むかし公開されてたCmachine探してるんだけど、 誰かもってない?あったらUPしてもらえる助かる。
>>613 int渡す意味があるのか
ポインタに配列指定してるのか
意味分んねぇ
>>616 の発言が意味わからない。
>>613 printf("%s%d%f"); これが安全だと思うなら安心して使えばよい。
>>613 そもそもargcが1ということもありえる。
ビル・ジョブスさんって もういないんですか?
622 :
デフォルトの名無しさん :2005/04/24(日) 10:46:38
>>613 リターンしてないから警告が出るんじゃね?
/* binsearch : v[0] <= v[1] <= ... <= v [n-1] の中でxを探せ */ int binsearch ( int x , int v[] , int n ) { int low , high , mid ; low = 0 ; high = n - 1 ; while ( low < high ){ mid = ( low + high ) / 2 ; if ( x <= v[mid] ) high = mid ; else low = mid + 1 ; } if ( x == v[low] ) return low ; /* 一致した */ else return -1 ; /* 一致するものがなかった */ } 2分探索のアルゴリズムをちょっと改良した奴で、 K&Rの3-1の演習の自分なりの答えです。 でも、K&Rのアンサーブックの答えとは違っていました。 このアルゴリズムだと何か問題ありますか?
>>623 引数の n が 0 の時、どうするよ?
>>624 int nではなく、unsigned nにすればいいw
626 :
デフォルトの名無しさん :2005/04/24(日) 14:23:05
>>622 低脳はだまれ ボケボケボケボケボケボケボケ!!
>>624 >>625 レスありがとうございます。確かにn=0のときは問題ありです…。
だけど、見て欲しいところは、元のソースが
/* binsearch : v[0] <= v[1] <= ... <= v [n-1] の中でxを探せ */
int binsearch ( int x , int v[] , int n )
{
int low , high , mid ;
low = 0 ;
high = n - 1 ;
while ( low <= high ){
mid = ( low + high ) / 2 ;
if ( x < v[mid] )
high = mid - 1 ;
else if ( x > v[mid] )
low = mid + 1 ;
else /* 一致した */
return mid ;
}
return -1 ; /* 一致するものがなかった */
}
でwhileループのアルゴリズムを簡単化したつもりなんですけど、
そこを変更したことによって動作に問題が無いかというのを見て欲しいです。
すいません。こちらの情報不足でした。
628 :
デフォルトの名無しさん :2005/04/24(日) 14:32:23
あめぞうを潰せませんか?
>>627 >そこを変更したことによって動作に問題が無いかというのを見て欲しいです。
だから実際起きているだろ?
n == 0 の時。
正しく動作しているなら、元の動作を変えてはいけない これ常識
すいません。やっと分かりました…。 元のソースでも変更後のソースでもn==0の時は while ( low <= high ) while ( low < high ) のどちらもlowとhighを初期化した次のwhileのテストで偽になってしまうので、 whileは1回も実行されず、元のソースは-1が返ります。n==0だからこれは当然です。 変更後のソースは初期化した後の low==0の状態でifをテストし、それで、もしx==v[0]ならばlowの値を返します。 n==0なのに、返値-1以外を返してしまう可能性が 変更後のソースにはあるから問題があるということですか? ということは、 if ( x == v[low] )を if ( low == high && x== v[low] )に変更すれば、あとは大丈夫ですか?
>>631 >n==0なのに、返値-1以外を返してしまう可能性が
>変更後のソースにはあるから問題があるということですか?
もちろん-1以外を返す可能性もあるが、
それ以前に v の要素数が 0 なのに v[0] を読み込んでいる時点で
OSが領域外のメモリアクセスを検知して、
そのプログラムの実行が強制的に中止させられていても
文句を言えない、というレベルの代物。
>if ( low == high && x== v[low] )に変更すれば、あとは大丈夫ですか?
とりあえず大丈夫そうだが、無駄な処理が多い。
元のソースの方が、ずっとスマート。
>>631 そそ、藻前様の工夫は見難くなるだけで効率もさして変わらない。
つまり、「改良」にはなってないわけだ。
配列で質問があります。 int x[5];を初期化する場合 int x[5] = {1,1,1,1,1}; で出来ますが、初期化以外で同じ値を入れる場合は、for文などの繰り返し処理か、x[0] = 1,x[1] = 1・・・・;のように一つずつ書く方法しかないんですか?
static int x[5] = {1,1,1,1,1}; みたいなのを用意しておいて memcpy
for文で回すよりたいていは速いだろ
すいません、ちょっとお聞きしたい事があるのですが、 char s[80]={"1 50 20 20 50"}; と宣言した文字配列を数字として取り出すことはできるでしょうか? 最初の1桁の数字を科目コードとして、 残りのスペースで区切られた2桁の数字を点数として取り出したいのですが・・・
>>637 そう? 根拠は?
速度が問題になるほどのデータ量なら、単純に考えると代入ループよりも遅くなると思うのだけど。
>>638 sscanf()を使え。
strtok()でもいいが。
strtol()で頑張ってもいいかも知らん。
atoi()だけじゃ無理だがな。
>>640 素早いご返答ありがとうございます、早速試してみますね(*´∀`)
>>639 >速度が問題になるほどのデータ量なら、単純に考えると代入ループよりも遅くなると思うのだけど。
そうなの?なんで?
CPUやコンパイラによるわな 気になるなら自分でアセンブルリスト見ろって感じだよ memcpyだけは選ばないけどさ。
>>632 とても勉強になりました。わざわざ詳しいレス本当にありがとうございます。
>>633 これくらいの違いなら他人が見たときの見やすさの方が大切なんですね。
>>642 >639が言いたいのはこういうことだろう。
代入ループ:データ(レジスタor即値)→メモリ
コピーループ:メモリ→(レジスタ)→メモリ
しかし、速度が問題になるような量なら、そもそも後者は現実的ではないので、>639は極論。
まぁ、要は>643ってこった。
サイズさえ合ってれば、wmemsetでいいんじゃないの?
647 :
デフォルトの名無しさん :2005/04/24(日) 22:26:40
649 :
デフォルトの名無しさん :2005/04/25(月) 07:43:38
こんにちは。画像処理のことについて質問です。 たとえば、AA001.raw〜〜AA512.rawの画像ファイルをいっきに 2値化処理する場合にはどのようなプログラムにすればよいのでしょうか? 下に書いたプログラムでは、コンパイルはできるのですが、うまく働いてくれません・・・ よろしくお願いします。
650 :
デフォルトの名無しさん :2005/04/25(月) 07:46:08
#include <stdio.h> #include <stdlib.h> #include <math.h> #define ERROR "error: program; input-filename; width; height; output-filename;\n" int width,height,i,j,ii,jj,header_size,n; unsigned char *in1; unsigned char *out1; int main(void) { for (n=001;n<=512;n++) {
651 :
デフォルトの名無しさん :2005/04/25(月) 07:46:35
void get_args(int argc, char *argv[]) { if(argc != 5) { fprintf(stderr, ERROR); exit(1); } width = atoi(argv[2]); printf("W = %d;", width); height = atoi(argv[3]); printf("H = %d;", height); }
652 :
デフォルトの名無しさん :2005/04/25(月) 07:47:02
void image_read_ushort(char *filename, int offset, unsigned char *im) { FILE *fp; if( (fp = fopen(filename[n].raw, "rb")) == NULL ) { printf("File Open Error Occured! \n"); exit(-1); } fseek(fp, offset, SEEK_SET); fread( ( unsigned char *)im, sizeof(unsigned char), width*height, fp ); fclose(fp); printf("File Opening...: %s\n", filename[n].raw); }
653 :
デフォルトの名無しさん :2005/04/25(月) 07:47:50
void image_write_ubyte(char *filename.raw, int width, int height, unsigned char *im) { FILE *fp; if( (fp = fopen(filename[n].raw, "wb")) == NULL ) { printf("File Open Error Occured! \n"); exit(-1); } fwrite( ( unsigned char *)im, sizeof( unsigned char), width*height, fp ); fclose(fp); }
654 :
デフォルトの名無しさん :2005/04/25(月) 07:57:07
int main(int argc, char *argv[]) { get_args(argc, argv); in1 = ( unsigned char *)malloc( width * height * sizeof( unsigned char) ); out1 = ( unsigned char *)malloc( width * height * sizeof( unsigned char) ); header_size = 0; image_read_ushort(argv[1], header_size, in1); threshold(in1,out1,width,height); image_write_ubyte(argv[4], width, height, out1); free(in1); free(out1); return 0; } ;} }
655 :
デフォルトの名無しさん :2005/04/25(月) 08:13:06
すいません、長くなりましたがよろしくお願いします
>>649 それ、画像処理が問題じゃありませんから。
どうして一遍に自分の知らないことに挑戦しようとするかな。
中身の処理はどうでもいいから、 ファイルを順に開くプログラムを先ず作ってみればいいのに。
で、あんたは、filename[n].rawというありもしないファイルを開こうとしているわけで。
先ずはファイル名をきちんとせいせいするプログラムを作りなさい。
あ、未だ質問する気満満なら初心者スレ行ってね。
657 :
デフォルトの名無しさん :2005/04/25(月) 10:07:53
ありがとうございました。がんばってみます
658 :
デフォルトの名無しさん :2005/04/25(月) 10:55:09
cprintfで使う文字型の"%lu"ってなんですか?
659 :
デフォルトの名無しさん :2005/04/25(月) 11:09:43
今度のテストでアルゴリズムが問題に入ると言われました、演算をしろ ということなんですかね?
>>658 スレ違い。
そんな非標準の関数の仕様など、環境依存スレで聞いてくれ。
printf()互換ならば、unsigned longの変換指定だが。
>>659 スレ違い。
アルゴリズムはCではない。アルゴリズムを実装する手段としてCを使うと言う話なら別だが。
661 :
デフォルトの名無しさん :2005/04/25(月) 11:56:43
>>660 すいません、アルゴリズムを実装する手段としてCを使うと言う
事です。その場合、flow chartをもらってそこからCを書いたりとか
の可能性がおおきいですかね?
663 :
デフォルトの名無しさん :2005/04/25(月) 14:15:18
664 :
デフォルトの名無しさん :2005/04/25(月) 14:30:42
指定の"%i"って何でしょうか?
( ^ω^) ウーン・・・ (⊃⊂)
>>664 マニュアルを紐解くと言う能力はないの?
struct ST_CELL{ int id; char *name; } という構造体を作り、ST_CELL型の配列をst_array[100]として作ります。 st_arrayに、idの大きさに無関係にデータが入っているとき、idの昇順に 並べ替えるには、どう処理すれば良いのでしょうか? stdlib.hをincludeし、qsortを以下のように使ってみたところ、idは全て 0になり、nameはぬるぽとなってしまいました。 int int_comp(const void *_a, const void *_b){ int a = *(int *)_a; int b = *(int *)_b; if(a < b){ return -1; } else if(a > b){ return 1; } else { return 0; } } という関数をつくり、 qsort(st_array, 適当な数値, sizeof(ST_CELL)*適当な数値, int_comp); お願いします。
>>667 int cellComp(const void *a, const void *b)
{
int idA = ((ST_CELL *) a)->id;
int idB = ((ST_CELL *) b)->id;
return idA < idB ? -1 : idA > idB ? 1 : 0;
}
qsort(st_array, sizeof(st_array) / sizeof(*st_array), sizeof(*st_array), cellComp);
or
qsort(st_array, sizeof(st_array) / sizeof(ST_CELL), sizeof(ST_CELL), cellComp);
669 :
667 :2005/04/25(月) 21:03:03
>>668 出来ました。構造体の中身(id)でソートしなければいけませんね。
ありがとうございます。
670 :
デフォルトの名無しさん :2005/04/25(月) 21:12:16
for文の制御変数で、 for(i=0; i<HOGE; i++) とするのが多いと思うけど、たまに for(i=0; i<HOGE; ++i) と前置でインクリメントしているソースを見かけます。 どういうメリット、違いがあるのでしょうか?
671 :
デフォルトの名無しさん :2005/04/25(月) 21:17:30
>>670 #define begin {
#define end }
に近いノリ
>>670 前置は、C++にレベルアップするための準備。
++C
>>672 そのつもりで俺も++i派だが
いつになってもC++にレベルアップしないんだよな
絶対負け組だよ俺
>>671 #define begin {
#define end ;}
だろ ぼけ
676 :
デフォルトの名無しさん :2005/04/25(月) 22:02:30
>>675 自分で定義したマクロでセミコロン打ち忘れるアフォに迎合できなくてもぼけてねえよ ぼけ
677 :
デフォルトの名無しさん :2005/04/25(月) 22:26:25
void rank1(struct data *x, int n) というふうに関数の引数に構造体のポインタが使われてるんだが main関数内でこの関数を使うとき実引数はどう書くの?
678 :
デフォルトの名無しさん :2005/04/25(月) 22:29:34
レベルアップってなバイアスかかってる時点で終わってるな なに言っても無駄、もうあきまへんわ
>>677 struct data hoge;
rank1(&hoge,5);
>>677 struct data a[100];
rank1(a, 100);
681 :
デフォルトの名無しさん :2005/04/25(月) 23:04:03
Cmachineお持ちの方いらっしゃいましたらUPお願いします。
microsoft.netのコンパイラを使っているのですが、 アセンブリ言語のコードを生成するコンパイラオプションを教えてください。
>>683 MSVCではアセンブリ吐かない。gcc使え。
またgcc厨が涌いてきたよ
>>686 厨ってなんだ?「〜が好きな人」という意味か?
/FA じゃあかんの?
俺、トマトジュース厨。 あいつ、さとう珠緒厨。
690 :
初心者 :2005/04/26(火) 00:25:50
すません。構造体とファイルの関連付けについてお聞きしたいのです。 AAA.csvの中身 "aaa","123" "aab","124" を構造体を使って読み込みたいのです。 ヘッダーにtypedef struct{ c1 char[3];c2 char[3];}BBB; として、extern struct BBB ccc[1]; としてcccを変数として定義するとこまでできました。 しかーし、cccとAAA.txtはどうやって関連付けるのでしょうか? fp = fopen("AAA.csv","r"); としても開かれるのは、AAA.csvであって構造体ではない気がします。 C言語初心者です。お忙しいと思いますが、皆様おしえてください。
文字と数字の文字列から数字を抜いて表示する関数ですが、 コンパイルエラーは出ないものの実行してみると何も表示されません。 読み込んだ文字列strからif文で0〜9以外を拾って文字列backに格納しています。 どこがおかしいのでしょうか? void del(char str[]) { unsigned i = 0; char back[100] = {0}; while(str[i]){ if(str[i] < '0' && '9' < str[i]) back[i] = str[i]; i++;} printf("%s\n",back); }
CSV大人気
>>690 fgets()で1行読み込んで、
sscanf()を駆使するか、strtok()で頑張るかして自分で構造体に格納する。
>>691 str[]とback[]のインデックスが同じままではbackに隙間ができてしまうではないか。
制御変数をもう一つ使ってループせよ。
F/A-18C
m9(^Д^)プギャー
>>691 >if(str[i] < '0' && '9' < str[i])
if (0)
って書きなおしたら?
>>691 void del(char* str) {while(*str) {if (!isdigit (*str)) putchar (*str); str++;}}
>>691 無駄が多すぎんだよ。なんだよbackて。100文字越えたらどうすんだよ。
>>691 char * del_digit(char * str)
{
char * p1 = str, * p2 = str;
puts(str);
while (*p2)
if (!isdigit(*p2)) ++p2;
else *p1++ = *p2++;
*p1 = '\0';
puts(str);
return str;
}
701 :
初心者 :2005/04/26(火) 01:00:20
>693 即レスありがとうございました。 定義したエリアに値を格納しないと使えないっつーことですね。 構造体を作ったら、ファイル作って、ファイルポインタかなんかで 関連つけることばかり考えてました。 ありがとうございました。
void del_digit(char * str) { for(;*str;++str) if (!isdigit(*str)) putchar(*str); }
703 :
デフォルトの名無しさん :2005/04/26(火) 05:46:22
704 :
デフォルトの名無しさん :2005/04/26(火) 12:41:56
sscanf()を駆使する!!!!!!
急速にスレの質が低下してまいりました
C言語なら他所で聞け!
スタイルキャストって何?
710 :
707 :2005/04/26(火) 16:45:04
解決しますた
>>707 それC++。
C++ではcharとsigned charとunsigned charは別物扱いだからキャストしないとコンパイルできない。
スタイルキャストって何ーーーーーーー?
714 :
デフォルトの名無しさん :2005/04/26(火) 17:46:49
配列を用いず、ポインタのみを用いて、入力した文字列の並びを反転し大文字と小文字を入れ替える 関数を作成してください. ただし、この関数の外(つまり、外部やmainで文字列を格納するとき)では、配列を用いてもかまいません . (例)abc12CDE と入力すると、edc21CBA と出力する. (2) さらに、構造体を用いて、入力したそれぞれの文字の頻度を出力する関数を作成してください. (例)abc12CDE と入力すると、 a = 1 b = 1 c = 2 1 = 1 2 = 1 d = 1 e = 1 と出力する.
> 作成してください 死ね。
719 :
デフォルトの名無しさん :2005/04/26(火) 19:09:58
ABS関数やIFを使わないで絶対値を求めるにはどうすればいいですか
>>721 #define abs(a) ((a)>=0?(a):-(a))
を一行入れておく。これは関数では無い。
abs(num++); とかや?%</fo2黷スりして
724 :
723 :2005/04/26(火) 19:32:28
化けた orz
C言語入門終えた程度の初心者ですけども 興味のあるlameのソースを見て勉強しようかなと思っています。 これ、勉強になるソースですか?難易度はどの程度でしょうか?
>>721 > ABS関数
C に「ABS関数」は存在しない。
> IF
C に「IF」は(ry
>>725 とりあえず、mp3のエンコーディングの勉強しようか。
IEEE形式浮動小数点なら、ビット演算一つで済む。
abs は #ifndef __cplusplus で囲ってくれ…
730 :
721 :2005/04/26(火) 21:10:09
>>722 >>726 説明不足ですいません
((a)>=0?(a):-(a))みたいな条件式やabs関数よりも早く処理する方法があるといわれてそれを探してるんです
ビット演算で出来るらしいんですけど、ヒントでいいんで何か助言してもらえないでしょうか
733 :
デフォルトの名無しさん :2005/04/26(火) 21:29:37
-a & a >> sizeof a * CHAR_BIT - 1 | a & ~(a >> sizeof a * CHAR_BIT -1)
734 :
デフォルトの名無しさん :2005/04/26(火) 22:19:52
構造体のメンバ変数の数を知る関数、もしくは良い方法は ないものでしょうか?
むりだ、そら。
>>734 全てのメンバのサイズが同じなら、構造体のサイズから計算はできる。しかし、他に適当な方法はない。
あ、がっかり・・・
>>730 IEEE形式の浮動小数点数限定。
#define FABS(x) (*(int64_t *)&(x) | 0x7fffffffffffffff)
単精度ならint32_t *、倍精度ならint64_t *辺りを使えば良いと思う。
1の補数を使っていれば整数にも使える。その場合はポインタを経由せずに直接キャストしてよい。
>734 C++でテンプレートとマクロを駆使すれば可能、 という実験をした覚えがある。
普通にヘッダさかのぼろうぜ
>>734 int test_begin = __LINE__;
struct test {
int a;
int b;
int c;
};
int test_end = __LINE__;
int main () {
printf ("%d", test_end-test_begin-3);
}
面白いな。 でも、あらかじめ準備するんだったら、方法はいろいろある。 既存の構造体を渡されて、メンバいくつかといわれたら一般には無理。
743 :
デフォルトの名無しさん :2005/04/26(火) 22:54:20
stringがたの文字の消去ってどうやってやるのですか。 テキストから読み込んだ文字を1行消したいのですが
>>743 そんなプリミティブ型は存在しません。
char型アレイの事かい?
745 :
デフォルトの名無しさん :2005/04/26(火) 23:06:44
1+1/2^2+1/3^2+・・・+1/1000^2 を計算せよ。 という問題がわかりません。どなたかご教授下さい。
宿題は宿題スレへ。
>>745 double f (int n) {
if (n <= 1) return 1.0;
else {return 1.0/((double)(n*n))+f (n-1);}
}
int main () {
printf ("%f\n", f (1000));
return 0;
}
なるべく宿題スレに誘導してくれよ また似たようなのが来ちゃうよ
テンプレに 「C++ はスレ違い」 って書いて欲しいな
750 :
デフォルトの名無しさん :2005/04/27(水) 00:18:30
UNIX(HP-UX)でどでかいファイルの読み込みアプリです。 出力メッセージを ファイル読み込み中・・・1% ファイル読み込み中・・・2% ファイル読み込み中・・・3% みたいにつらつらメッセージが表示されるんじゃなく ファイル読み込み中・・・1% ~~この数値のみ変化する みたいにしたいんだけど なんか良いAPI or 手段ってあるかしら
コンソールなら、"\r"で同一行に表示したら?
\b
\a
えんいー
&harts;
♥
急速にスレの質が低下してまいりました
おやつの昆布、全部食べちゃいました。 どうしたらいいですか?
死ねばいいと思うよ
>>760 #include <stdio.h>
int main(void)
{
printf("Hello, world!\n");
return 0;
}
int main(void) { if (!昆布) { 買う(昆布); } 食べる(昆布) return 0; }
int main(void) { おやつ 昆布; for(; ; ) { if (!昆布) 買う(昆布); 食べる(昆布) } return 0; }
dejavu?
キーボードから自然数nを入力して1からnまでの7の倍数の和を求める プログラムをさくせいするのだがいまいちわかりません 7の倍数てのはどう表現すればいいんですかねぇ?
>>768 小学校からやり直した方がいいよ
7 * n
for(i=1; i<=n; x++) if(i%7==0) printf("%dは7の倍数です。\n",i); else printf("%dは7の倍数ではありません。\n",i);
7 の倍数かどうか判定するまでもなかった。 #include <cstdio> int InputNum() { char buf[256]; int ret; for(; ; ) { printf("数値を入力してください: "); fgets(buf, sizeof(buf), stdin); if(sscanf(buf, "%d", &ret)) return ret; } } int main() { int i, num, sum = 0; num = InputNum(); for(i = 7; i <= num; i += 7) sum += i; printf("%d までの 7 の倍数の和は %d です。\n", num, sum); return 0; }
774 :
768 :2005/04/27(水) 14:15:49
#include <stdio.h> int main(void) { int n, sum, i; printf("n -->"); scanf("%d",&n); sum = 0; for ( i=1; i<n; i=i+7) sum = sum + i; printf("1から%dまでの7の倍数の和は%dです。\n", n, sum); return 0; } ではだめですかねぇ?
> for ( i=1; i<n; i=i+7)
>>768 int f (int n) {if (n <= 0) return 0; else if (n%7) return f (n-1); else return n + f (n-1);}
int f (int n) {if (n <= 0) return 0; else if (n%7) return f (n-1); else return n + f (n-1);} int main () { int n; scanf ("%d", &n); printf ("%d\n", f (n)); return 0; }
778 :
768 :2005/04/27(水) 14:28:58
おーけー解決しますた
>>776 int f(int n){return n <= 0 ? 0 : ((n % 7) ? 0 : n) + f(n - 1);}
781 :
デフォルトの名無しさん :2005/04/27(水) 15:03:24
お前らバカですか?
782 :
デフォルトの名無しさん :2005/04/27(水) 15:06:53
int i; char **ps2; ps2 = (char **)malloc(sizeof(char *) * 5); for(i=0; i<5; i++){ *(ps2 + i) = (char *)malloc(5); strcpy(*(ps2 + i), "test"); } 上のソースは問題ないでしょうか?ポインタ配列のアドレスが順番にとられる ことは保障されているのでしょうか?
>>782 問題なしだが *(ps2 + i) じゃなくて ps2[i] って書けよ。
>>781 死ね。
>>782 各要素の長さが 5 で決まってるのなら ↓のがよさげ。
int i;
char (*ps2)[5];
ps2 = (char (*)[5])malloc(sizeof(char[5]) * 5);
for(i = 0; i < 5; i++)
strcpy(ps2[i], "test");
785 :
デフォルトの名無しさん :2005/04/27(水) 15:13:27
**を別関数で***で受けてメモリを確保したいのですが可能ですか?
786 :
デフォルトの名無しさん :2005/04/27(水) 15:14:39
ちなみに5はテストです。この部分も動的です。
可能です、********はコンパイラの制限内で幾らでも可能です。
789 :
デフォルトの名無しさん :2005/04/27(水) 15:20:16
void po2(char ***ps); int main(){ char **ps2; po2(&ps2); return 0; } void po2(char ***ps2){ int i; *ps2 = (char **)malloc(sizeof(char *) * 5); for(i=0; i<5; i++){ *ps2[i] = (char *)malloc(5); strcpy(*ps2[i], "test"); } } 上記で途中で落ちるのですが、何が間違いでしょうか?
×*ps2[i] ○(*ps2)[i]
791 :
デフォルトの名無しさん :2005/04/27(水) 15:27:48
ありがとうございます。解決しましたが、 何が違うのかよくわかりませんでした。
> 何が違うのかよくわかりませんでした。 苦労が報われなかった瞬間
演算子の優先順位ぐらい覚えとけよ
794 :
デフォルトの名無しさん :2005/04/27(水) 15:47:51
ありがとうございました。出直してきます。
さーて、米でも研ぐか。
今夜のおかずは何にしようかな。 お前ら何がいい?
金クレ
急速にスレの質が低下してまいりました
799 :
デフォルトの名無しさん :2005/04/27(水) 17:17:09
何回もスマソ。 int **ap; int aa[5][5]; aa[3][2] = 100; ap = (int **)aa; printf("%d",ap[3][2]); これは不可能でしょうか?mallocを使わずにapで参照したいのです。 おかずはからあげがいいです。
>>799 「aa[3][2]」と「ap[3][2]」とでは意味が異なる。
> これは不可能でしょうか?mallocを使わずにapで参照したいのです。 不可能です。 > おかずはからあげがいいです。 不可能です。
>>801 >> おかずはからあげがいいです。
>不可能です。
空age位出来るだろ!
int **ap; ┌──┐ ┌───┬───┬───┬───┬───┬─ │ap[0].|───────→│ap[0][0].|.ap[0][1] |.ap[0][2] |.ap[0][3] |.ap[0][4] | ・・・ ├──┤ ├───┼───┼───┼───┼───┼─ │ap[1].|───────→│ap[1][0].|.ap[1][1] |.ap[1][2] |.ap[1][3] |.ap[1][4] | ・・・ ├──┤ ├───┼───┼───┼───┼───┼─ │ap[2].|───────→│ap[2][0].|.ap[2][1] |.ap[2][2] |.ap[2][3] |.ap[2][4] | ・・・ ├──┤ ├───┼───┼───┼───┼───┼─ │ap[3].|───────→│ap[3][0].|.ap[3][1] |.ap[3][2] |.ap[3][3] |.ap[3][4] | ・・・ ├──┤ ├───┼───┼───┼───┼───┼─ │ap[4].|───────→│ap[4][0].|.ap[4][1] |.ap[4][2] |.ap[4][3] |.ap[4][4] | ・・・ ├──┤ └───┴───┴───┴───┴───┴─ : int aa[5][5]; ┌───┬───┬───┬───┬───┬───┬───┬─ ─┬───┬───┐ │aa[0][0].|.aa[0][1] |.aa[0][2] |.aa[0][3] |.aa[0][4] |.aa[1][0] |.aa[1][1] | ・・・ .|.aa[4][3] |.aa[4][4] | └───┴───┴───┴───┴───┴───┴───┴─ ─┴───┴───┘
テキストファイルを一文字ずつ読み込んで、 カンマ(,)がくるとそれまでの内容を 変数に格納するコードを作りたいのですがよく分かりません。 教えてください。
>>799 int (*ap)[5];
int aa[5][5];
ap = aa;
>806 スマソ。 if ((fp = fopen("test.txt", "r")) == NULL) { printf("error\n"); exit(1); } while (fgets(s, 256, fp) != NULL) { if (s == ',') { printf("%s", s); return 0; } printf("%s", s); } fclose(fp); こんな感じだと思うんですが、的は外れてないでしょうか?
>>807 妙に外れてる
char s[256] なのに s == ',' になるハズは無い
っていうか、コンマが来たときに fclose されてない
そもそも一文字づつ読んでない
811 :
807 :2005/04/27(水) 18:06:29
ワケワカメ。やっぱ出直してきます
char buf[1024]; int ch, cnt = 0; FILE *fp; if ((fp = fopen("test.txt", "r")) == NULL) { printf("error\n"); exit(1); } while ((ch = fgetc(fp)) != EOF) { if(ch == ',') break; buf[cnt++] = ch; } buf[cnt] = '\0'; fclose(fp); printf("%s", buf); 何か仕様が違う気はするんだが
int main() { char key[] = "A52A2245332A252B435B2222A2B2A2A23A2C32A3B5B2222A52B43532A2352C23A52A2246D2A3533B35K2A4D22A3224A45D2C25B2A32A5D2C25D4A26C4A1"; char *p = key; int i, c, b = 1; while(*p) { c = 0; for(i = 0; i < 8; i++) { if(*p == '0') { if(!*++p) break; b = !b; } c <<= 1; c += b; if((*p)-- == 'A') *p = '0'; if(*p >= 'A') b = !b; } if(c) putchar(c); } getchar(); return 0; }
814 :
807 :2005/04/27(水) 18:48:35
>812 わざわざありがとうございます。fgetcなんて忘れてたorz
>>804 #include <stdio.h>
#include <stdlib.h>
int tokenizer (char* tok, FILE* fin) {
int i;
char c;
for (i = 0;; ++i) {
c = fgetc (fin);
switch (c) {
case ',': case EOF: tok[i] = '\0'; return i ? 1+strlen (tok) : EOF;
default: tok[i] = c;
}
}
}
int main () {
FILE* fin;
char tok[256];
if ((fin = fopen("hoge.txt", "r")) == NULL) return EXIT_FAILURE;
while (tokenizer (tok, fin) != EOF) printf ("tok: %s\n",tok);
return EXIT_SUCCESS;
}
TestConC.c(9) : warning C4013: 関数 'strlen' は定義されていません。int 型の値を返す外部関数と見なします。
818 :
デフォルトの名無しさん :2005/04/27(水) 19:10:21
>>813 を実行したら変な表示が出ました
どうしたらいいですか
死ねばいいと思うよ。
>>817 氏ね。string.hインクルードしとけ。
strlenが文字列の長さを出力する関数だって想像できるだろ。 標準ライブラリに同じ名前の関数が定義されているんだから。 それに、ソースの全体をここに書いてやる必要がどこにある? 質問者がそれを見て理解できればそれでいいんだよ。 くだらん揚げ足とりは不愉快だから、消えてくれ。
>>799 こういうことならできる。malloc()を補助的に使えばint **へaaを入れるのも不可能ではないが。
int (*ap)[5];
int aa[5][5];
aa[3][2] = 100;
ap = aa;
printf("%d", ap[3][2]);
int *p;
int aa[5][5];
aa[3][2] = 100;
p = *aa;
printf("%d", p[3 * 5 + 2]);
急速にスレの質が低下してまいりました
>>821 ミスっちゃったのがそんなに恥ずかしい? ププッ
>>821 マジレスすると、コンパイルが通ってしまうので初心者が間違いに気付かない
可能性がある。(・A・)イクナイ
C++ みたいにエラーになってくれればまだ救いがあったけどね。
間違い? 合法なCの使い方じゃん。
合法だからまた害じゃないということは無いと思うが
>>826 もともと、実際に動く物を作ってやる必要はないはずだが?
実際に動くものを作ってほしい奴はぼるじょあスレに行けばいい。
もともと #include <stdio.h> #include <stdlib.h> があるのに #include <string.h> がないよアハハーって話なのに、それが 「ぼるじょあスレに行け」 だって? 何というか、最近の若いもんはこうも無責任なもんなの?
>>830 そうだ。トイレの落書きに責任なんかある訳ないだろ。氏ねよ。
そういう態度取ってると質問者いなくなるよ
細きゃあこと言っとらんで はよ宿題スレに行きゃあて
834 :
832 :2005/04/27(水) 22:05:31
835 :
デフォルトの名無しさん :2005/04/27(水) 22:20:24
心配せんでも、育て甲斐のある後進と、ただのゴミは区別している 論外なやつには露骨に嫌悪感を表に出す それだけのことだ
(・∀・)?
837 :
デフォルトの名無しさん :2005/04/27(水) 22:43:35
コンマ演算子は処理系依存ですか?
839 :
デフォルトの名無しさん :2005/04/27(水) 22:51:28
規格にあっても asm は処理系依存だな sizeof(int) とかも
asm は処理系依存だな asm は処理系依存だな asm は処理系依存だな asm は処理系依存だな asm は処理系依存だな asm は処理系依存だな asm は処理系依存だな
しかしコンマ演算子は処理系依存ではない。
842 :
デフォルトの名無しさん :2005/04/27(水) 22:58:49
>sizeof(int) とかも は信じていいですか? 初めて聞いたんですけど
sizeof(int) の結果は処理系依存。 sizeof(char) の結果は必ず 1。
intが16bitだったり32bitだったりするって話だろーよ
>>842 規格には-32767〜32767の値を表現できなければならないと書かれているだけ。
846 :
デフォルトの名無しさん :2005/04/27(水) 23:04:20
あぁ、そういう意味でしたか。 sizeof 演算子自体が処理系によってないのかとおもたです。 レスありがとうございました。
847 :
デフォルトの名無しさん :2005/04/27(水) 23:07:34
>>847 asmはC++のキーワード
Cではなんの意味も無く、識別子としても予約すらされていない。
isascii が処理系にない場合、どのように作ればいいのでしょうか?
int isascii(int c) { return 0x00 <= (unsigned char)c && (unsigned char)c <= 0x7F; }
cが256以上だと
int isascii(int c) { return isupper(c) || islower(c); }
854 :
853 :2005/04/27(水) 23:37:04
orz
int isascii(int c) {return c&0x7f;}
856 :
デフォルトの名無しさん :2005/04/27(水) 23:41:35
857 :
デフォルトの名無しさん :2005/04/27(水) 23:42:18
訂正:0x00は?
というより isascii って標準じゃないの?
859 :
デフォルトの名無しさん :2005/04/27(水) 23:47:33
>>858 isascii() は非標準
iswascii() は標準
>>859 標準関数が使える環境が前提のスレじゃなかったか?
int isascii(int c) { #ifdef isascii return isascii(c); #else return !(c & (~0x7F)); /* 標準でない場合 */ #endif }
無限再帰?
#ifndef isascii int isascii(int c) {...} #endif
864 :
デフォルトの名無しさん :2005/04/28(木) 00:10:49
865 :
デフォルトの名無しさん :2005/04/28(木) 06:48:52
>>860 標準関数が使えない規格合致処理系だってあるぞ
866 :
デフォルトの名無しさん :2005/04/28(木) 11:05:45
FILE *fp; int i, icnt; char buf[1000]; char **pss; /* ファイルからの読み込み部分から・・・ */ icnt = 0; pss = (char **)malloc(sizeof(char *)); while(fgets(&buf[0], 1001, fp) != NULL){ pss[icnt] = (char *)malloc(sizeof(char) * (strlen(&buf[0]) + 1)); strcpy(pss[icnt], &buf[0]); icnt++; pss = (char **)realloc(pss, sizeof(char *) * (icnt + 1)); } pss = (char **)realloc(pss, sizeof(char *) * icnt); fclose(fp); ・・・中略 /* メモリの解放 */ free(&pss[0]); 上記の処理でfree(&pss[0])だけでメモリはきちんと解放されるのでしょうか?
>>832 質問者がいなくなるのはとてもいいことだと思いますが。何か問題でも?
869 :
デフォルトの名無しさん :
2005/04/28(木) 11:53:38 すみませんが、解放の方法を教えてください。