C言語なら俺に訊け! Part 106

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。

エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

各種リンク、関連スレは>>2-13あたり

C言語なら俺に聞け! Part 105
http://pc8.2ch.net/test/read.cgi/tech/1111117094/
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
2デフォルトの名無しさん:2005/04/07(木) 12:42:33
【コンパイラ】
gcc
http://gcc.gnu.org/

【Win32用の開発環境のみ。】
gcc-cygwin
http://www.cygwin.com/
gcc-mingw
http://www.mingw.org
Digital Mars C++
http://www.digitalmars.com/
Open Watcom
http://www.openwatcom.com/
Borland C++ Compiler 5.5.1
http://www.borland.co.jp/cppbuilder/freecompiler/
Visual C++ Developer Center: Microsoft Visual C++ Toolkit 2003
http://msdn.microsoft.com/visualc/vctoolkit2003/

【ライセンスや機能などに問題あり】
Microsoft C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/~lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html
Intel C++ Compiler for Linux
http://developer.intel.com/software/products/compilers/clin/noncom.htm
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なのでしょうか?

この場合だと、文字列終端に、ヌル文字を入れるということになるということで
よろしいのでしょうか?
7デフォルトの名無しさん:2005/04/07(木) 14:20:11
それコンパイル通るかやってみた?
8デフォルトの名無しさん:2005/04/07(木) 14:30:37
試してたらそんな質問するわけないだろ
9デフォルトの名無しさん:2005/04/07(木) 15:01:02
>>6
配列の初期化の場合、そんな書き方はしない。
10デフォルトの名無しさん:2005/04/07(木) 15:05:04
>>6
1. 配列なんだから = {0} で初期化
2. 文字配列なんだから = "" で初期化
どっちでも。
116:2005/04/07(木) 15:29:44
http://rec.ncos.co.jp/cgi-bin/e000.cgi?242

/* 文字列の終端にヌル文字 */
charstrings[MAX] = '\0' ;

と記述がしてあったもので。
私もこの処理法は知らなかったので、お聞きしたまでです。
12デフォルトの名無しさん:2005/04/07(木) 15:51:30
>>11
違うじゃねぇかよ!!
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++のみ
15デフォルトの名無しさん:2005/04/07(木) 16:02:51
>>11のリンク先に間違いが幾つあるか賭けない?
漏れは少なくとも100はあるとみたね。
#誤字、誤変換を含む。
16デフォルトの名無しさん:2005/04/07(木) 16:05:22
>>14
*cp++;

cp++;
を較べているので同意になる。
func(*cp++);
などのように、値を使用しているわけではない。
176:2005/04/07(木) 16:14:39
>>16
よくわかりました。
本当にありがとうございます。
18デフォルトの名無しさん:2005/04/07(木) 16:16:03
>>14
>>16の解説を参考にしつつ、
ついでに、前置と後置の違いも勉強し直せ。
19デフォルトの名無しさん:2005/04/07(木) 16:17:43
えらそーに
20デフォルトの名無しさん:2005/04/07(木) 16:31:20
ディスプレイやPC本体を
マヨネーズで磨くと新品同様にピカピカになる。
おまえらもやってみ?
21デフォルトの名無しさん:2005/04/07(木) 16:35:09
歯磨き粉で磨くと傷が埋まる程度のレベル
22デフォルトの名無しさん:2005/04/07(木) 16:42:00
マン汁で磨くとツルツルになるよ。
23デフォルトの名無しさん:2005/04/07(木) 16:43:33
>>22
どうやって抽出するんだ
24デフォルトの名無しさん:2005/04/07(木) 16:46:56
頼めよ。下手な鉄砲何とやらだぞ。
25デフォルトの名無しさん:2005/04/07(木) 17:47:53
26デフォルトの名無しさん:2005/04/07(木) 18:14:32
推薦図書/必読書のためのスレッド PART 23
http://pc8.2ch.net/test/read.cgi/tech/1112178595/
27デフォルトの名無しさん:2005/04/07(木) 18:36:43
スレ違いだったか、悪かった
28デフォルトの名無しさん:2005/04/08(金) 01:55:46
>>25
僕の経験から、そういうアルゴリズム辞典系の本はあまり役に立たないよ。
載っているのは基礎的なもので、サンプルプログラム集としてならみることもあるかもしれないけれど。
その中から一つだけ選ぶとしたら、奥村さんのアルゴリズム辞典かな。
29デフォルトの名無しさん:2005/04/08(金) 12:22:11
>>28
そうやって、用意されているAPIしか触れないプログラマが量産されていくわけですね。
30もうすぐ就職試験 ◆pTadMR86pE :2005/04/08(金) 12:25:35
ポインタの型キャストのことなのですが、
具体的にはどのように利用すればよいのでしょう?
31デフォルトの名無しさん:2005/04/08(金) 12:31:36
>>29
違う違う、僕が言いたいのは、アルゴリズムは身に着けるものであって、
切り貼り技術ではあまり役に立たないということだよ。
32デフォルトの名無しさん:2005/04/08(金) 12:35:16
一人称が「僕」はキモイ
33デフォルトの名無しさん:2005/04/08(金) 12:36:15
じゃ、僕様チャン
34デフォルトの名無しさん:2005/04/08(金) 12:36:17
僕もそう思ったw
35デフォルトの名無しさん:2005/04/08(金) 12:37:13
>>31
>身に着ける

衣類じゃねぇんだぞ、ゴルァ!
36デフォルトの名無しさん:2005/04/08(金) 12:37:41
>>35
なに?僕様チャンに意見するわけ?
37デフォルトの名無しさん:2005/04/08(金) 12:41:40
ボクはいいと思うよ。
38デフォルトの名無しさん:2005/04/08(金) 12:50:49

【Win32用の開発環境のみ。】
gcc-cygwin
http://www.cygwin.com/

【ライセンスや機能などに問題あり】


cygwinのgccは生成されたバイナリに途方もないライセンスの問題があるけどな
39デフォルトの名無しさん:2005/04/08(金) 12:55:22
cygwinなんか絶対使わねー。
40デフォルトの名無しさん:2005/04/08(金) 12:55:49
そんなもん入れるぐらいなら素直にLinuxやらUnixやらいれるです。
41デフォルトの名無しさん:2005/04/08(金) 22:03:29
ファイル内のアドレス情報を保存して、後からその位置に移動できるようにしたい
のですが、どうすれば良いでしょうか?

OSはUNIXでコンパイラはCCです

FILE *fp;
FILE ffp = *fp;

じゃ駄目ぽ? 
42デフォルトの名無しさん:2005/04/08(金) 22:10:49
位置を記録する変数作っておいてfseekで飛ぶんじゃだめ?
43デフォルトの名無しさん:2005/04/08(金) 22:11:09
スマソ、自己解決ftellとfseekで出来るのねorz
44デフォルトの名無しさん:2005/04/08(金) 22:11:35
>>42さん、わざわざどうもアリガd
45デフォルトの名無しさん:2005/04/09(土) 17:31:39
char *str={(A%2) != 0)?"奇数です":"偶数です"}
char str[]={(A%2) != 0)?"奇数です":"偶数です"}
なんかの本でこんな感じのやつがのってて、戦うCプログラマだったけかな
で上はコンパイルが通るが下は通らないなんでかわかるよなって・・って感じで
問いかけてくる本だったんだが、なんでかわかりません
一緒じゃねーの?教えてください
46デフォルトの名無しさん:2005/04/09(土) 17:35:03
>>45
>>1のfaq読め
それでわからなかったらお前は無能。
47デフォルトの名無しさん:2005/04/09(土) 17:58:06
>>46
そんな答えは期待してねぇよ
48デフォルトの名無しさん:2005/04/10(日) 09:25:10
>>45
下のstrはcharの配列。

(A % 2) != 0) ? "奇数です" : "偶数です"
この式の結果はchar *だ。

charの配列はcharへのポインタで初期化できないから下はエラーになる。
(char s[] = "hoge";のような文字列リテラルでの初期化は例外的に出来るようになっているだけ)

なおstrはconst char *にする方が好ましい。
49デフォルトの名無しさん:2005/04/10(日) 11:31:37
char s[] = {"こうやって書くべきじゃない?"};
50デフォルトの名無しさん:2005/04/10(日) 11:36:54
↑もう少し具体的にどうぞ。
51デフォルトの名無しさん:2005/04/10(日) 11:49:21
×char s[] = "こうやって書くべきじゃない?";
◎char s[] = {"こうやって書くべきじゃない?"};
52デフォルトの名無しさん:2005/04/10(日) 11:49:58
文字列はリストで管理しろよ。
53デフォルトの名無しさん:2005/04/10(日) 12:00:57
>>51
何で?二次元でもないのに??
54デフォルトの名無しさん:2005/04/10(日) 12:16:12
>>28
あの本、一見よさげだが Huffman 法の説明とか読んでみな
55デフォルトの名無しさん:2005/04/10(日) 12:18:25
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
そのままコンパイルする馬鹿
58デフォルトの名無しさん:2005/04/10(日) 12:43:06
>>56
はい、えらいえらい
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
>>64
二度は言わん

こちらへ誘導
http://pc8.2ch.net/test/read.cgi/tech/1108989422/
66デフォルトの名無しさん:2005/04/10(日) 13:12:26
アドレス演算子について警告しなかった意図すら通じていないような超のつくアフォが参加できるスレではない
67デフォルトの名無しさん:2005/04/10(日) 13:13:02
>二度は言わん
一度目はどこで言ったんだよw
68デフォルトの名無しさん:2005/04/10(日) 13:16:15
三度ももちろん言わない
誘導はした
これより荒らしと見なす
69デフォルトの名無しさん:2005/04/10(日) 13:28:08
>>67
「二度は言わない」と言ったら、その後にくるのが一度目でしょう。
致命的な莫迦ですね。
70デフォルトの名無しさん:2005/04/10(日) 13:32:30
……前なんじゃないの?
71デフォルトの名無しさん:2005/04/10(日) 13:36:57
「二度は言わん」=「一度しか言わん」
72デフォルトの名無しさん:2005/04/10(日) 13:36:57
両方あり得る?
73デフォルトの名無しさん:2005/04/10(日) 13:38:31
ほにゃららだ。もう二度は言わないぞ。
二度は言わないが、ほにゃららという事だ。

>>69
二度は言わないなら、もう言わないんじゃないか?w
74デフォルトの名無しさん:2005/04/10(日) 13:38:54
俺は
「二度はない」=「次はない」と捉えたけど。
75デフォルトの名無しさん:2005/04/10(日) 13:40:41
おい、スレ無駄にすんなよ、どうでもいいこと書くな。
76デフォルトの名無しさん:2005/04/10(日) 13:41:00
ごめん、自己レスさせて。

>二度は言わないが、ほにゃららという事だ。
二度言ってるじゃんorz
77デフォルトのワロスさん:2005/04/10(日) 13:47:57
二度は言わん
三度ももちろん言わない
スレを無駄にする奴は
これより荒らしと見なす
78デフォルトの名無しさん:2005/04/10(日) 13:52:45
>>59
ここって、Cのスレじゃないの?
79デフォルトの名無しさん:2005/04/10(日) 14:16:02
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
よく読みなおせ
82デフォルトの名無しさん:2005/04/10(日) 14:26:21
>>80
頭がおかいい。
83デフォルトの名無しさん:2005/04/10(日) 14:39:01
>>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]);
}
84デフォルトの名無しさん:2005/04/10(日) 14:39:18
85デフォルトの名無しさん:2005/04/10(日) 14:43:08
>>83
fgetcをcharでうけるな
86デフォルトの名無しさん:2005/04/10(日) 14:47:43
>>85
お、ありがと。
char ch; -> int ch; だね。
87デフォルトの名無しさん:2005/04/10(日) 14:51:34
こうかな。

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]);
}
88デフォルトの名無しさん:2005/04/10(日) 18:01:56
なんかどっかの会社の新人研修とかじゃないだろうなぁ。。
89デフォルトの名無しさん:2005/04/10(日) 18:24:20
何でfgetcをchar形で受けてはいけないんですか?
90デフォルトの名無しさん:2005/04/10(日) 18:25:47
EOFが認識できないから
91デフォルトの名無しさん:2005/04/10(日) 18:31:58
EOFは何者をも認識することはない。EOFはただ返されるのみだ。
正しく「EOFを認識できない」と言おうじゃないか。
92デフォルトの名無しさん:2005/04/10(日) 19:30:06
C言語で 1 % 2 の答えが0になってしまうのですが何でですか?
コンパイラはVC++です。
93デフォルトの名無しさん:2005/04/10(日) 19:32:28
>>92
周辺のソース見せてみな。
君が間違っているはずだから。
9492: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
こらこら % と / の間違いは誤差じゃ済まんぞ
9692:2005/04/10(日) 19:40:44
すいません。
7行目 c = 1 % 2;
にしてください。

実験しててそのままにしていました。
97デフォルトの名無しさん:2005/04/10(日) 19:53:51
>>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:\>
99デフォルトの名無しさん:2005/04/10(日) 20:00:03
・ソース書く
・ノートパッドで修正する
・ファイル名に勝手に..txtが付いて別ファイルになる
・一生懸命コンパイルするがコンパイルされるのは元のソースファイル
100デフォルトの名無しさん:2005/04/10(日) 20:08:32
・「登録済みの拡張子は表示しない」になっていて事態は深刻
101デフォルトの名無しさん:2005/04/10(日) 20:17:53
VCのコンソールプログラムから他のプログラムに入力し、結果を
受け取るにはどうすればいいのでしょうか?
pipeを使うらしいのですが、いまいち分からないです。
102デフォルトの名無しさん:2005/04/10(日) 20:19:14
VC で pipe ???
103デフォルトの名無しさん:2005/04/10(日) 20:21:16
windowsでもリダイレクトやパイプは使えるだろ
104デフォルトの名無しさん:2005/04/10(日) 20:24:17
>>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()
のときに「'=' : 互換性のない型が含まれています。」
とエラーを返してきます。
どこが間違っているのでしょうか?
106デフォルトの名無しさん:2005/04/11(月) 18:52:07
momoryOpen?
107デフォルトの名無しさん:2005/04/11(月) 18:52:47
プロトタイプ宣言の戻り値がポインタになってないぞ。
108デフォルトの名無しさん:2005/04/11(月) 18:52:49
>>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 など
英語も頑張れ。

109105:2005/04/11(月) 19:01:09
・・・・・恥ずかしすぎる。

教えてくれてありがとう。
110デフォルトの名無しさん:2005/04/11(月) 19:02:12
<graph.h>って最近のコンパイラには付いて無いんですか?
VS2003やBCCに無いんですが…orz
111デフォルトの名無しさん:2005/04/11(月) 19:13:11
自前で書きませう
112デフォルトの名無しさん:2005/04/11(月) 19:15:07
そんな…もうDLできないヘッダなんですか?
113デフォルトの名無しさん:2005/04/11(月) 19:20:01
ヘッダだけあってもライブラリがないから無意味では?
114デフォルトの名無しさん:2005/04/11(月) 19:35:30
「もう」とか以前に標準的なライブラリじゃないからな。
最初っからついていない。
115デフォルトの名無しさん:2005/04/11(月) 20:20:14
つるぼC でも使ってろ
116デフォルトの名無しさん:2005/04/11(月) 20:22:24
どういう環境で使おうとしたのか気になるな
117デフォルトの名無しさん:2005/04/11(月) 21:03:38
プリプロセッサについて質問です。

#define AAA ("123")
#define BBB ("456")

のとき "123000456"をdefineしたいときはどう書けばいいのでしょうか?

#define CCC AAA"000"##BBB
ではだめみたいなのです。
118デフォルトの名無しさん:2005/04/11(月) 21:09:34
#define AAA "123"
#define BBB "456"
#define CCC AAA"000"BBB

じゃだめなん?
119117:2005/04/11(月) 21:16:37
>>118
ありがとうございます。できました。
括弧つけちゃいけなかったです
120デフォルトの名無しさん:2005/04/12(火) 01:23:11
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
121デフォルトの名無しさん:2005/04/12(火) 01:25:23
>>120
C言語をもっと勉強してからもう一度来てください。
122デフォルトの名無しさん:2005/04/12(火) 01:26:34
>>120
それはもちろん
ビット演算です。
123デフォルトの名無しさん:2005/04/12(火) 01:26:49
>>120
必要になるまでほっとけ
もしかしたら一生必要にならないかもしれないし
いつかどこかで必要になるかもしれない
124デフォルトの名無しさん:2005/04/12(火) 01:27:21
2で割るとき。
//まあ、最適化があるから、ふつーは意識しないのだが。
125120:2005/04/12(火) 01:28:15
>>122
具体的にはどんなときでしょうか?
126デフォルトの名無しさん:2005/04/12(火) 01:29:29
例えば32bitに格納されてるRGBAをバラしたい時とか
エンディアンを変換したい時とか
127デフォルトの名無しさん:2005/04/12(火) 01:30:47
128デフォルトの名無しさん:2005/04/12(火) 01:47:05
>>125
PCでは出番は少ないけど
組み込みとかでフラグを一つの変数に詰め込んだりとか
APIにもビットフラグを指定させるのがあったり(defineされてるけど)
あとは>>126とか
ソフトでpacked演算をしたい時とか
129デフォルトの名無しさん:2005/04/12(火) 01:47:10
>>127
ヽ(`Д´)ノ
130デフォルトの名無しさん:2005/04/12(火) 02:14:37
なんだ釣りか
131デフォルトの名無しさん:2005/04/12(火) 02:40:17
printf("%s", NULL);

これで文字列 "(null)" が出力されるのは標準だと思っていいの?
132デフォルトの名無しさん:2005/04/12(火) 02:47:53
うちのコンパイラでは "nullpo" と表示されます
133デフォルトの名無しさん:2005/04/12(火) 03:51:18
>>131
ヌルポインタの指す領域をアクセスした時の動作は未定義。
したがって、その動作は規格に(JISでもISOでも)違反していない。
そういう意味では、標準。

どの処理系でも同じ動作をするか?という質問なら標準ではない。
134デフォルトの名無しさん:2005/04/12(火) 04:02:54
おやつの昆布、全部食べちゃいました。
どうしたらいいですか?
135デフォルトの名無しさん:2005/04/12(火) 06:32:28
死ねばいいと思うよ
136デフォルトの名無しさん:2005/04/12(火) 06:37:07
>>134
もう一袋買ってくる
137デフォルトの名無しさん:2005/04/12(火) 06:52:06
>>134
#include <stdio.h>

int main(void)
{
  printf("Hello, world!\n");
  return 0;
}
138デフォルトの名無しさん:2005/04/12(火) 06:59:07
int main(void)
{
    if (!昆布) {
        買う(昆布);
    }

    食べる(昆布)

    return 0;
}
139デフォルトの名無しさん:2005/04/12(火) 07:16:21
int main(void)
{
  おやつ 昆布;
  for(; ; )
  {
    if (!昆布)
      買う(昆布);
    食べる(昆布)
}
return 0;
}
140デフォルトの名無しさん:2005/04/12(火) 09:42:44
>>134
頑張れ!!
141デフォルトの名無しさん:2005/04/12(火) 11:24:30
unsigned char hex[16]があります。
これを連結した型で文字列に変換したいのですが、
スマートな方法をアドバイスお願いできないでしょうか?

wsprintf( str, "%02X%02X...", hex[0],hex[1] .... );

みたいに作っているのですが長いし美しくないしで。
宜しくお願いします。
142デフォルトの名無しさん:2005/04/12(火) 11:33:12
>>141
多分そっちの方がスマート。
標準でやろうとするとこうなる。

char buf[33];
int i;
for(i = 0; i < 16; i++)
sprintf(&buf[i * 2], "%02X", hex[i]);
143デフォルトの名無しさん:2005/04/12(火) 16:45:10
誰か105のdatうpよろしこ
144デフォルトの名無しさん:2005/04/12(火) 17:30:27
145デフォルトの名無しさん:2005/04/12(火) 17:51:22
>>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++;
  }
}
一応任意の文字列に対応できる
146デフォルトの名無しさん:2005/04/12(火) 18:41:42
>>144
( ´∀`)アリガトー
147デフォルトの名無しさん:2005/04/12(火) 22:55:50
C言語で簡単なゲーム(テトリスなど)を作りたい場合
基礎文法の習得後になにをやるべきですか?
148デフォルトの名無しさん:2005/04/12(火) 22:57:27
>>147
ゲームのコードを書いてコンパイルすればよい
149デフォルトの名無しさん:2005/04/12(火) 23:09:06
>>148
なるほど!ありがとうございます!!
150デフォルトの名無しさん:2005/04/12(火) 23:11:49
>>147-149
なんなんだいったい!
151デフォルトの名無しさん:2005/04/13(水) 01:32:44
俺も基本が終わったところだけど次に何したらいいのかよくわからん
152デフォルトの名無しさん:2005/04/13(水) 02:10:28
なんでもいいから書け
自分用のソフトを作ってみるとか
他人のソースを改造してみるとか
言語の習得は入り口に過ぎない事に気づく
153デフォルトの名無しさん:2005/04/13(水) 02:15:49
>>151
したいことが無いなら世間勉強しとけ。
もしくは、世の中でどんな研究がされているのか調べたり、
SF小説で出てきた機能はどうやれば実現できるのかとか考えてみたりしてみたらどう。
154デフォルトの名無しさん:2005/04/13(水) 02:29:02
私なんか、エレベータ乗るたび、自販機使うたびに、シミュレーションソフトを作りたくなってくるのに。
#暇がないから作りませんが。
##エレベータのシミュレータといえば、Towerが元々はそう言う目論見だったそうな。
###古いゲームだから知らんかな。
155デフォルトの名無しさん:2005/04/13(水) 09:21:44
制御系に行く人てやはり理系の電子工学ばりばりの人しかいけないの?
156デフォルトの名無しさん:2005/04/13(水) 09:49:21
>>155
夢見る文系でもWelCone
157デフォルトの名無しさん:2005/04/13(水) 10:29:22
ウェルコーン
158デフォルトの名無しさん:2005/04/13(水) 11:04:34
VMS系のファイルパスで
TEST$ROOT:[TEMP.COBOL_SOURCE]C1.COB;2
という内容の文字列を取得してるコードなのですが
ディレクトリ終端記号となる"]"以降の
ファイル名称を取り出したくおもいます。
"]"の位置を検索してそれ以降を取ればいのだとおもうのですが
何分コボラーなのでCがさっぱりわかりません
助言お願いします。というかズバリ回答のほういただけないでしょうか
159158:2005/04/13(水) 11:44:02
すみません。もう一つ教えてください
VAXではファイル世代を;記号以降で判別するのですが
ファイル名称のみを取得するのにはバージョン記号以下が
邪魔となりますので、そこらあたりの除去等もご教授ください
よろしくお願いします。
160デフォルトの名無しさん:2005/04/13(水) 12:19:28
#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;
}

初心者だって言うから動くように全部書いてやったけど、
あとのことくらいは自分で調べろ
161デフォルトの名無しさん:2005/04/13(水) 12:20:57
s/char* p = strrchr(s, ']');/char* p = strrchr(s, ']') + 1;
コンパイル通してないんで通るかどうかは保証しない
162デフォルトの名無しさん:2005/04/13(水) 12:29:09
>>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;
}
163デフォルトの名無しさん:2005/04/13(水) 12:30:18
>>158
>何分コボラーなので

じゃあ、コボルで書け
164デフォルトの名無しさん:2005/04/13(水) 12:40:59

基本ソフトなどに欠陥 マイクロソフト、修正を呼び掛け

http://www.sankei.co.jp/news/050413/kei049.htm

165158: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;
};

間違えました・・・。
169デフォルトの名無しさん:2005/04/13(水) 14:52:19
>>166
木の前にポインタ勉強しろやボケ
170デフォルトの名無しさん:2005/04/13(水) 15:02:35
>>156-157
ワロス
171デフォルトの名無しさん:2005/04/13(水) 15:12:50
>>166
nowがNULLの時にnow->nameなんてしませんように
172デフォルトの名無しさん:2005/04/13(水) 15:30:17
>>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;
}

これでもだめでした・・・。
173デフォルトの名無しさん:2005/04/13(水) 15:44:45
なんでこいつはこんなに理解力がないんだろう…
174デフォルトの名無しさん:2005/04/13(水) 16:46:58
>>172
キミの想定する仕様では、output(NULL) はOKなの? NGなの?
175デフォルトの名無しさん:2005/04/13(水) 16:49:23
>>174
この関数の場合それは必要なことなんですか?
176デフォルトの名無しさん:2005/04/13(水) 17:02:01
>>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)を呼んではいけない。
177デフォルトの名無しさん:2005/04/13(水) 17:11:08
下に示す行列x,y,の積を求めるプログラムを作成せよ。
x[2][3] = { { 1 , 2 , 3 } , { 4 , 5 , 6 } } 
y[3][2] = { { 1 , 5 } , { 5 , 3 } , { 8 , 1 } }
って問題なんですが、for文を使ってやることは分かるんですが、どういう式を書けばいいのかわかりません。
よろしくおねがいします
178デフォルトの名無しさん:2005/04/13(水) 17:27:03
行列の積の計算方法は分かってるのか?
179デフォルトの名無しさん:2005/04/13(水) 17:35:37
>>178
わかるんですが、forを使ってどうやればいいのかがわからないんです。
180デフォルトの名無しさん:2005/04/13(水) 17:37:27
C知ってるのか?
181デフォルトの名無しさん:2005/04/13(水) 17:45:25
>>177
宿題スレへどうぞ。
182デフォルトの名無しさん:2005/04/13(水) 19:54:16
実行者に一次元配列の大きさを尋ね、その大きさの配列を作るには
どうすればいいのでしょうか?
183デフォルトの名無しさん:2005/04/13(水) 20:19:29
malloc
184デフォルトの名無しさん:2005/04/13(水) 20:21:27
>>182
配列使わずリスト使え。
185デフォルトの名無しさん:2005/04/13(水) 20:25:58
簡単にはできないみたいですね。
メモリ確保とリストを調べてみます。
186184:2005/04/13(水) 20:26:56
>>185
嘘です、冗談です、はったりです!
本当は、malloc使ってください。
187デフォルトの名無しさん:2005/04/13(水) 20:28:22
>>182
つまりですね、

a=100;
char* m;
m = (char*)malloc(a*sizeof(char));
で100個のchar型の領域が確保されます。
188デフォルトの名無しさん:2005/04/13(水) 20:50:23
>>187
ありがとうございます。

char m[5];
m[3]=10;

上と下は同じ処理ができてますか?

char* m;
m = (char*)malloc(5*sizeof(char));
*(m+3)=10;
189デフォルトの名無しさん:2005/04/13(水) 20:52:25
両方とも
m[3]=10;
で使えなかったっけ?
190デフォルトの名無しさん:2005/04/13(水) 20:52:36
>>188
どこに領域が確保されるのか、という議論を無視すれば同じ結果になるでしょう。

あと、*(m+3)という書き方の代わりにm[3]という書き方も許されています。
191デフォルトの名無しさん:2005/04/13(水) 20:55:04
>>189-190
おぉ、今まで通りの書き方でOKなんだ。
ありがとうございました。
192192:2005/04/13(水) 21:36:10
こんばんは。質問です。
@数値を入力 >A 文字列に交換 >B 出力 をしたいです。

Aの文字列に変換する目的は、例えば1000を入力した場合、1,000というように
3桁ごとにカンマを挟みたいからです。

文字列を交換する部分には、 itoa  という関数を使用し、
main関数から呼び出そうと考えています。

助力まってます。長々と失礼しました。
193デフォルトの名無しさん:2005/04/13(水) 21:43:13
で、何を助力してほしいのですか?
194192:2005/04/13(水) 21:48:50
itoa関数を使って、何桁かの数値を
3桁ごとにカンマで区切って表示する、、、、
プログラムをぶっちゃけ教えてください!
例みたいのがあるとうれしい限りです。
195デフォルトの名無しさん:2005/04/13(水) 21:55:24
とっとと宿題スレへ失せろ
議論してて楽しくねえんだよ

*:「ザコめが・・・ つまらん!
196デフォルトの名無しさん:2005/04/13(水) 22:13:34
>>192
itoaとか面倒なことせずに、ロケール設定しろ。
197デフォルトの名無しさん:2005/04/13(水) 22:29:52
とりあえずマルチポストをやめることから始めたらいいと思うんだ。
198デフォルトの名無しさん:2005/04/13(水) 22:32:37
クロスポストの手本を見せてくれ
199デフォルトの名無しさん:2005/04/13(水) 22:44:31
ええけつしとるのぉ(*´Д`)ハァハァ
http://169.254.227.26/
http://169.254.227.26/~ss.jpg
http:///
http:///~ss.jpg
200デフォルトの名無しさん:2005/04/13(水) 23:13:14
scanf("%x"&input_data);
としてもプログラムがscanfを無視してしまいます。
コンパイルオプションが悪いのでしょうか?

仕方無いので
while(input_data != 0){
  scanf("%x"&input_data);
}
とすると何とか動きますが。
201デフォルトの名無しさん:2005/04/13(水) 23:25:41
>200
マピロマハマディワロス
202デフォルトの名無しさん:2005/04/13(水) 23:37:16
祟りだな(((( ;゚Д゚)))ガクガクブルブル
203デフォルトの名無しさん:2005/04/13(水) 23:55:28
あるバッファを高速にゼロクリアして、さらにゼロになっているかかくにんするプログラムを作りたい
けど、とにかく高速に処理をしたいと思っています。
何か良い方法はありますか?

とりあえず、今は・・・

1.先頭のアドレスが4の倍数になるまで1バイトずつゼロクリア。
 ゼロクリアの確認はゼロクリアした領域をORして0になっているか確認。
2.先頭アドレスが4の倍数になったら4バイトずつゼロクリア。確認方法は上と同じ。
3.残りの端数をゼロクリア

なお2の処理が一番のメインになるのだが、ループしてゼロクリアする際にループの中で処理を展開することで
ループ回数を減らしている。
例)10000回のループであった場合、1回のループでクリア処理を10回行い、ループ回数を1000回にする・・・など

一応この方法で300KBのバッファを
昔(普通にループしてクリア)712ms
今(上の処理を利用してクリア)92ms
でした。
さらに早くはなるでしょうか? 
204デフォルトの名無しさん:2005/04/13(水) 23:58:26
MMXを使う
又はループをすべてアンロールする
205デフォルトの名無しさん:2005/04/14(木) 00:07:20
>>203
先ずはマルチポストをやめるのがいいよ。
206デフォルトの名無しさん:2005/04/14(木) 01:10:04
>>154
TowerIIの箱が手元に…
207デフォルトの名無しさん:2005/04/14(木) 01:12:41
>>200
コンマを書くという選択枝はないのか?
208デフォルトの名無しさん:2005/04/14(木) 01:25:25
解っててやってるんだから
ツッコんだら負け
209デフォルトの名無しさん:2005/04/14(木) 01:58:52
>>207
ったく……。
210デフォルトの名無しさん:2005/04/14(木) 10:17:19
>>203
char * buf = calloc(1, 300*1024);
このコードとどっちが早い?
211デフォルトの名無しさん:2005/04/14(木) 10:34:44
構造体のポインタを宣言するときって、
typedef struct _tagAAA {
struct _tagAAA *p
}HOGE ;
とかって、この時タグ名省略できないと考えているのですが、
もしかして、省略して記述できる方法とかってありますか?
212デフォルトの名無しさん:2005/04/14(木) 11:02:13
>>211
どう省略できると思うんだ?
213デフォルトの名無しさん:2005/04/14(木) 11:02:29
>>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;
}
214デフォルトの名無しさん:2005/04/14(木) 11:20:42
>>211
typedef struct tagHoge HOGE;
struct {
    HOGE *next;
} HOGE;
215214:2005/04/14(木) 11:22:02
間違えたっぽ。こんな感じだと思って流してくれ
216デフォルトの名無しさん:2005/04/14(木) 11:24:16
>>214
タグ名省略してないじゃん
217デフォルトの名無しさん:2005/04/14(木) 11:28:44
前定義識別名の __struct__ を使えば良い。
typedef struct { __struct__ *next; } T;
218デフォルトの名無しさん:2005/04/14(木) 11:34:31
>>217
勉強になりました。
219デフォルトの名無しさん:2005/04/14(木) 12:00:02
>>217
ありがとうございます。
僕も勉強になりました。
220デフォルトの名無しさん:2005/04/14(木) 12:10:30
>>217
知らんかった、マジで
221デフォルトの名無しさん:2005/04/14(木) 12:18:39
>>217って標準?見たこと無いんだけど…
222デフォルトの名無しさん:2005/04/14(木) 12:33:01
非標準。
223デフォルトの名無しさん:2005/04/14(木) 12:34:39
>>221
つ[メル欄]
224デフォルトの名無しさん:2005/04/14(木) 13:52:32
>>211
typedef struct {
 void *p;
}HOGE ;
225デフォルトの名無しさん:2005/04/14(木) 14:10:47
>>224
ワラタ
226デフォルトの名無しさん:2005/04/14(木) 16:47:59
なぜ省略したいと考えるんだろう?
打つのが面倒くさいから?
227デフォルトの名無しさん:2005/04/14(木) 18:11:53
>>211
これじゃいかんの?

typedef struct tag_DataBlock{
intdata1;
intdata2;
}DATABLOCK,*DATABLOCK;
228デフォルトの名無しさん:2005/04/14(木) 18:19:38
>>227
素晴らしい。
229デフォルトの名無しさん:2005/04/14(木) 18:26:55
>>228
でしょ。
230デフォルトの名無しさん:2005/04/14(木) 19:11:59
質問、小数点以下第5位以下を削りたい場合どのようにしたらよい?
231デフォルトの名無しさん:2005/04/14(木) 19:30:33
10000倍して整数にして小数にして1/10000。
232デフォルトの名無しさん:2005/04/14(木) 19:36:36
0.00001 で割る。
233デフォルトの名無しさん:2005/04/14(木) 19:54:36
質問です
モンテカルロ法で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;
}
234デフォルトの名無しさん:2005/04/14(木) 20:02:46
>>233
楕円の公式
高校でやらんのか
235234:2005/04/14(木) 20:04:16
うわ、公式ってなんだよ。
方程式です...orz
236デフォルトの名無しさん:2005/04/15(金) 02:13:57
どこかでC言語のコンパイラはアセンブリ言語のコードも吐いてくれると
聞いた気がするのですが、Borland C++では出来ないのでしょうか?
CPADで使ってますがやり方がよくわかりません。
逆アセンブラというのが必要なんでしょうか?
hello worldみたいな自分で入力したコードを、
手軽にアセンブラコードで見てみたいのですが…。
237デフォルトの名無しさん:2005/04/15(金) 02:18:15
コンパイラオプション
-S 又は -B でOK。
ついでに、フリーの奴にはTASMが含まれてないので
アセンブラソースはアセンブルできない。
238236:2005/04/15(金) 02:31:03
>>237
即レスありがとうございます!
コンパイラオプションは使ったことがなかったので手間取りましたが、

>bcc32 -S hello.c

でhello.asmファイルが無事出来ました!
239デフォルトの名無しさん:2005/04/15(金) 11:11:04
ソケットから受け取った 00 1E 84 80 41 41 41 というデータを、
char *data に入れて、最初の4バイトの数字と残りの3バイトの文字列を分離したいのですが、
int suuji = 00 1E 84 80
char moji = 41 41 41
みたいにするにはどうすればいいのでしょうか?
240デフォルトの名無しさん:2005/04/15(金) 11:14:21
>>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';
241デフォルトの名無しさん:2005/04/15(金) 11:23:19
なるほど、memcpy関数を使うのですね。
ご親切にどうもありがとうございましたm(_ _)m
242デフォルトの名無しさん:2005/04/15(金) 11:59:29
>>233 「x*x/4+y*y=1 で表される楕円の面積を求めるプログラムで
     x*x/4+y*y=1というのはどういう公式なのか」
>>234 「楕円の方程式」

(´・ω・`)ナニ? コノ カイワ…
243デフォルトの名無しさん:2005/04/15(金) 12:02:07
>>240
エンディアン無視しないように。
244初心者:2005/04/15(金) 13:35:58
はじめまして
3次元の画像処理を行いたいのですが、Cで3次元はどのように展開していけばよいのでしょうか?
2次元でしかしたことがなくて、聞く人もいなくて困っています。
よろしくお願いします
245デフォルトの名無しさん:2005/04/15(金) 13:46:43
マルチだからスルーよろ
246デフォルトの名無しさん:2005/04/15(金) 14:34:05
>>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];
とか。
247デフォルトの名無しさん:2005/04/15(金) 15:17:25
>>246
なるほど!
それでもいいんですね。
帰ったらやってみます。
ありがとうございました。
248デフォルトの名無しさん:2005/04/15(金) 17:01:18
できました!
本当にどうもありがとうございました。
unsignedしてなかったのに255まで入ると思い込んでいたのも出来なかった理由でした〓■●
249デフォルトの名無しさん:2005/04/16(土) 12:01:25
ちょっと疑問に思ったので質問させてもらいます。
char a = new char[5];
char *b;
というように初期化した場合、
a[4] = NULL;
は大丈夫そうですが、
b[4] = NULL;
とした場合は何か良くないですか?
250デフォルトの名無しさん:2005/04/16(土) 12:04:25
(´・ω・`)C++は知らんがな
251デフォルトの名無しさん:2005/04/16(土) 12:15:50
>>249
b[4] = NULL;はbがどこを指しているかわからいから何が起こるかわからない。

そもそもNULLはポインタそのものが無効なことを表すのに使う。
だからcharにNULLを使うのは間違い。a[4] = '\0'; b[4] = '\0';が正しい。(さっきの問題でb[4] = '\0';はもちろん正しく動かないが)
252デフォルトの名無しさん:2005/04/16(土) 12:23:08
関数内でヒープからローカルのポインタ変数にメモリブロックを取得して
解放しないで関数から抜ければ
関数を呼ぶたびに解放されない領域が増えて
メモリリークするよね?
253デフォルトの名無しさん:2005/04/16(土) 12:30:34
>>251
そうなんですか。
教えてくださりありがとうございました。
本当に勉強になります。
254デフォルトの名無しさん:2005/04/16(土) 12:36:10
255デフォルトの名無しさん:2005/04/16(土) 13:00:43
f(x)=x^2+x+1という関数を作って
キーボードにnを入力したら、n個のf(x)の値を出力するようなプログラムを教えてください。
例えば3と入力するとf(0)とf(1)とf(2)の値を出力される感じです。
256デフォルトの名無しさん:2005/04/16(土) 13:06:04
いやだ
257デフォルトの名無しさん:2005/04/16(土) 13:15:38
>>255
丸投げするなら宿題スレへお逝きなさい。
258255:2005/04/16(土) 13:17:18
そうします(汗
259デフォルトの名無しさん:2005/04/16(土) 14:21:35
>>252
関数外で解放していれば、メモリリークは起きない。
260デフォルトの名無しさん:2005/04/16(土) 15:36:10
メモリリークって何ですか?
261デフォルトの名無しさん:2005/04/16(土) 15:39:37
>260
>1
262デフォルトの名無しさん:2005/04/16(土) 15:48:44
メモがリリーク(離陸)すること。
263デフォルトの名無しさん:2005/04/16(土) 15:50:56
  ______  
  |__|__    ___|___
  |__|__  │_l__l___  ‐‐┴‐‐    ___
  |__|____ │_|__|__|   ニニ        /  ./   |  ll       ┼─‐ |     ├‐  |
       .| │ |__ |__  ┌‐┐  ̄ヽ  /   /⌒l  |    ┼┼、  / T  |  \ .__|   |
/ | | | _| ノ ._|__ |__   |__|   _ノ  ヽ__ /  し ヽ__ノ  ヽ ノ  / ○ヽ し   (_丿\  .
264デフォルトの名無しさん:2005/04/16(土) 15:51:09
265デフォルトの名無しさん:2005/04/16(土) 17:05:39
>>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)の方が早いって聞いたんですが、本当ですか?
268デフォルトの名無しさん:2005/04/16(土) 18:27:28
>>267
どちらが手っ取り早いかは人によるのでは?
269デフォルトの名無しさん:2005/04/16(土) 18:27:39
>>267
よく起こりそうなありそうな方を前にする
(あんまり無い方をelse節にする)

ってのが江戸っ子の生き方、有様
270デフォルトの名無しさん:2005/04/16(土) 18:28:11
>>267
分岐後の処理が全く違うのにどう比べるつもりなの?
271デフォルトの名無しさん:2005/04/16(土) 18:30:00
>>267
少なくともそのコーディングスタイルは読みにくい。
272デフォルトの名無しさん:2005/04/16(土) 18:32:09
そもそも分岐の条件が違うじゃないか。
273デフォルトの名無しさん:2005/04/16(土) 18:32:28
>>268
いや、友達が

if( エラーではない ) 
  { 
    通常の処理;  --------- (a)
  } 
else 
  { 
    エラー処理; ---------- (b)
  } 

その他の処理; ---------- (c)
return;

とあった場合、CPUは(a),(c)の部分を先読みして、
始めのif文がエラーだった場合に(b)の部分を読むとか言ってたので。

>>269
了解です。ありがとうございました。
274デフォルトの名無しさん:2005/04/16(土) 18:32:53
したがって、エラー処理とはいえ、処理速度を考えるなら
正常ルートより頻度の高いエラー処理は前に書くのだ

でも、普通は見にくくなるから
こんなやり方はしない。多分しないと思う。しないんじゃないかな。
275デフォルトの名無しさん:2005/04/16(土) 18:34:11
例外に処理速度期待するなよ(´・ω・`)
例外が多いならそれは正常系と考えろよwww
276デフォルトの名無しさん:2005/04/16(土) 18:39:18
実装依存、環境依存
277デフォルトの名無しさん:2005/04/16(土) 18:40:42
>>275
承知した―――!
278デフォルトの名無しさん:2005/04/16(土) 18:42:01
アホが多くて困る。もうね、2chというところは…
279デフォルトの名無しさん:2005/04/16(土) 18:42:56
頭悪い意見ばかりで見ていて嫌になる。
俺以外にもっとマシな人間はいないのか。
280デフォルトの名無しさん:2005/04/16(土) 19:28:16
>>279
オレオレ、オレだよオレ
281デフォルトの名無しさん:2005/04/16(土) 19:31:09
Windows2000/XPのコンソールでエスケープシーケンスを使うのにはどうしたらいいでしょうか?
進捗状況を表示させたいと思っています("%d%", int)
この後、前に表示した画面を消去したいと思っています。
printf("\x01b[2J");
みたいな使い方ができるのでしたらお教えください。

// コンパイラ:VC++6
// WindowsXP SP2

機種依存的な質問ですので、スレ違いでしたら誘導願います。
282デフォルトの名無しさん:2005/04/16(土) 19:33:52
>>272
分岐条件どころか、処理内容そのものが変わってる。

# 1の「普段は起きないエラー処理」を有無を言わさず行うのは如何なものか…
283デフォルトの名無しさん:2005/04/16(土) 19:34:47
>>281
そもそも、誘導スレがなかったっけ?
284デフォルトの名無しさん:2005/04/16(土) 19:35:41
>>259
関数外でどうやって解放するのですか?
関数の戻り値の一つに取得したアドレスを埋め込んでおいて、それを解放するとか?
285281:2005/04/16(土) 19:37:57
>>283
誘導スレに逝ってきます_| ̄|○
286デフォルトの名無しさん:2005/04/16(土) 19:48:31
>>274
if(p == 0){ // なんかのポインタがゼロだったら
log_err();
return;
}
// 以下、通常処理

とかは普通にやらないか?
287デフォルトの名無しさん:2005/04/16(土) 19:53:04
>>285
誘導するまでもない。
行の先頭に戻って書き直すだけでいいなら'\r'を試せ。
288デフォルトの名無しさん:2005/04/16(土) 19:53:27
>>284
だいたいyes
関数の戻り値の一つっていうのがわけわからんが
289デフォルトの名無しさん:2005/04/16(土) 20:26:01
構造体を返すつもりとか
290デフォルトの名無しさん:2005/04/16(土) 20:38:01
現実的じゃないね
291デフォルトの名無しさん:2005/04/16(土) 21:31:58
構造体のメンバーに初期値を持たせるにはどうしたらいい?
292デフォルトの名無しさん:2005/04/16(土) 21:33:40
知ってるけどその態度にムカついたので教えない
293デフォルトの名無しさん:2005/04/16(土) 21:34:41
俺洩れも。
294281:2005/04/16(土) 21:42:52
>>287
Thanx!
とりあえずは、解決しました。

現在の進捗状況:%d %
みたいにしたかった場合は、エスケープシーケンスみたいなのが必要ですよね?

続きは
http://pc8.2ch.net/test/read.cgi/tech/1066747198/75-76
のスレで聞いてきます。

ありがとうございました&スレ汚しスマソ
295デフォルトの名無しさん:2005/04/16(土) 22:00:46
俺はC言語初めて3年独学で業務経験ないんだが
今日面接へいったら、いきなり笑われたよ。
家でやってるぐらいじゃ話にならないといわれたよ・・・・
あんなに笑われるとはな・・・
296デフォルトの名無しさん:2005/04/16(土) 22:07:31
仕事で使ったという実績がないと会社は嫌がるだろ普通
笑うのもどうかと思うが
そんなの適当に経歴でっちあげちまえばいいのに

まぁ何年やっても使えない奴はいるけど
297デフォルトの名無しさん:2005/04/16(土) 22:17:36
C言語は何を買えばC言語できますか
298デフォルトの名無しさん:2005/04/16(土) 22:20:34
>>295
>家でやってるぐらいじゃ話にならないといわれたよ・・・・
>あんなに笑われるとはな・・・

レベルの低い会社ほど「趣味グラマ」を嫌う。
これ、常識。

趣味で鍛えられた奴なら、現場にいけば直ぐに分かる。
いわゆる「プロ」のレベルの低さが。
299デフォルトの名無しさん:2005/04/16(土) 22:23:09
>>297
釣りでもマジでも一回氏んでこい
300デフォルトの名無しさん:2005/04/16(土) 22:25:50
>>260 は俺様の釣りだった
301デフォルトの名無しさん:2005/04/16(土) 22:26:31
プログラムできても人とのコミュニケーションがとれなきゃ意味ないけどな
口で「3年やってますた」っていわれてもどの程度かわからんし
何かブツでも持っていかないと判断の仕様がない

現に3年やってったってポインタ分かってない奴がいたりするしな
302デフォルトの名無しさん:2005/04/16(土) 22:28:59
ある程度のレベルまでいってれば、面接の会話だけでも使えそうなやつだとわかるんだけどね。
C言語できますか、なんて会話をしているようでは、あんまり期待できない。
303デフォルトの名無しさん:2005/04/16(土) 22:29:46
面接官がどんな立場の人かは知らないが、常識も余裕もない小者だね
実績もクソも同業者から流れてきた人でもない限りその会社の仕事に関しては素人だろ
ちゃんとした人事屋なら見るべきポイントはそんなところじゃなかったはず
数こそ少ないがアマチュアでもプロ並みな人はやっぱりいるし
なまじ技量があっても仕事に対する思想が腐ってる奴には会社を任せられない
あなたもアピールのしかたがよくなかった
履歴書に書けない能力は現物で見せるとかしないと
単に実務経験なしですが独学してますじゃ通じるわけないよ
304デフォルトの名無しさん:2005/04/16(土) 23:00:10
構造体のメンバーに初期値を持たせるにはどうしたらいいのですか?
305デフォルトの名無しさん:2005/04/16(土) 23:03:04
struct
{
int membr1;
char member2;
long member3;
} Hoge = { 1, '2', 3L }
306デフォルトの名無しさん:2005/04/17(日) 00:40:06
scanfを使った後のgetcharが機能しなくなるのは仕様でつか?
307デフォルトの名無しさん:2005/04/17(日) 00:46:59
>>306
scanf()の使い方によっては、その通り。
だからscanf()は薦められない。
308デフォルトの名無しさん:2005/04/17(日) 00:48:22
ちゃんと機能してるし
それがわからん奴だけが scanf を忌み嫌う
おまえらまとめてアフォ
309デフォルトの名無しさん:2005/04/17(日) 00:51:07
scanf使う奴こそアフォ
310デフォルトの名無しさん:2005/04/17(日) 00:51:29
たぶんscanf の入力形式指定で最後に改行を入れていないんだろ。
そうすると、getcharで改行コード取得して、期待通りの動きにならない。
311デフォルトの名無しさん:2005/04/17(日) 00:53:06
まあ自分が使えないツールを人に薦められないってのは道理だな(プ
312デフォルトの名無しさん:2005/04/17(日) 00:53:47
>たぶんscanf の入力形式指定で最後に改行を入れていないんだろ
scanf("%d\n", &x); とかやるわけ?馬鹿?
313デフォルトの名無しさん:2005/04/17(日) 00:54:26
趣味グラマもピンキリだからねぇ。
学生の頃からフリーソフト出してたようなタイプは使えるけど、
社会人になって(なぜか)プログラムを始めたとかいう人は変な癖
付いちゃってたりして教え直すのが大変。
314デフォルトの名無しさん:2005/04/17(日) 00:55:00
>>312
そうだが、なにかおかしいか?
315デフォルトの名無しさん:2005/04/17(日) 00:56:01
業務経験10年ありますなんて言いながら碌なプログラムも書けない香具師を教えなおすよりはまし。
316デフォルトの名無しさん:2005/04/17(日) 00:56:07
scanf使うのはかまわないが、人に薦める奴は信用しない。
317デフォルトの名無しさん:2005/04/17(日) 00:56:25
>>314
話にならん
318デフォルトの名無しさん:2005/04/17(日) 00:56:25
ローカル変数はスタックにとられるけど、
初期値つきの変数はdataセグメントにとられる
では、初期値つきのローカル変数はどちらにとられるのですか?
staticと同じ扱いですか?
それともスタックにとって、コンパイラが変数初期化のコードを自動で生成するのですか?
319デフォルトの名無しさん:2005/04/17(日) 00:57:02
>>316
だれも薦めてませんが。
320デフォルトの名無しさん:2005/04/17(日) 00:57:45
>>317
話してないじゃんw
321デフォルトの名無しさん:2005/04/17(日) 00:58:09
Cの規格的に、dataセグメントなんてあったっけ?
322デフォルトの名無しさん:2005/04/17(日) 00:59:26
>>318
どのセグメントに何が配置されるかは、Cの規格では規定されていない。
323デフォルトの名無しさん:2005/04/17(日) 01:05:34
>>318
スタックにとったあと、値を代入。
ある意味初期値とは言えないな。
324デフォルトの名無しさん:2005/04/17(日) 01:06:11
>>321-322
一般的なコンパイラとしてはどうなのでしょうか?
325デフォルトの名無しさん:2005/04/17(日) 01:07:12
>>318
>初期値つきの変数はdataセグメントにとられる

おまえさんがおそらく想定しているであろう処理系でもこれはウソ
326デフォルトの名無しさん:2005/04/17(日) 01:08:06
「一般的な」コンパイラなどというものはない
327デフォルトの名無しさん:2005/04/17(日) 01:33:47
セグメントって何ですか?
328デフォルトの名無しさん:2005/04/17(日) 01:36:55
適当に答えると、dataセグメントに定数を配置してそれを毎度スタックにコピーじゃねぇの?
329デフォルトの名無しさん:2005/04/17(日) 01:46:56
スタックにコピーする必要性は無いような。
つか、スタックにコピーしたらまずいような。
330デフォルトの名無しさん:2005/04/17(日) 06:42:27
すみません、 「空白の宣言」って何なんでしょうか?
331デフォルトの名無しさん:2005/04/17(日) 07:49:45
>>330
それだけじゃ誰も何の事か判らないと思うぞ。

>コンパイラの警告 (レベル 2) C4091
>空白の宣言が見つかりました。
>
>ユーザー定義型の宣言の先頭で指定された __declspec 属性は、その型の変数に
>適用されます。このコンパイラの警告は、変数が宣言されていない場合に発生します。

この話ならVC++のスレで訊いた方がいいよ。
332デフォルトの名無しさん:2005/04/17(日) 09:27:37
>>331
実はちょっといじってたらなおってしまったので、気になってたんです
変数辺りなのは分かってるんですが・・・他スレいってきます。
333デフォルトの名無しさん:2005/04/17(日) 09:34:28
K&RのアッペンディックスBには,math.hもstdio.hなどと同様に標準ライブラリ関数を含んでいると書かれているので,
math.hをincludeしたプログラムをgccでコンパイルするときに-lmを指定しなくても良さそうなのですが,
実際には-lmでリンカにライブラリを指定するのは,なぜなんでしょう.
(つまり,リンカからみた場合のmath.hとstdio.hの違いってなんでしょう)
334デフォルトの名無しさん:2005/04/17(日) 10:26:48
>>333
リンカからはどちらも全く同じ。何故ならば、全く関係ないから。

math.h内で宣言された関数とstdio.h内で宣言された関数の違いなら、
後者はたまたまディフォルトではリンクしないことになっているだけ。

いずれにしても、環境依存なので詳細はunixスレなどの該当スレへ。
335333:2005/04/17(日) 10:31:55
>>334
ありがとさん
unixスレ行ってきます
336デフォルトの名無しさん:2005/04/17(日) 10:35:50
BorlandC++を使っている者です。

C言語で、正規表現を使うにはどうしたらよいのでしょうか?
C++でなら、http://www11.plala.or.jp/studyhall/cpp/tregexp.htmlというのが見つかったのですが・・・
どなたかお願いします。
337デフォルトの名無しさん:2005/04/17(日) 10:45:11
>>328
dataセグメントからスタックにコピーするくらいなら、リテラルでじゅうぶん
そもそも変数の記憶場所をスタックとdataセグメントの両方に持たせるのは無駄だし、
dataセグメントの意味がない
338デフォルトの名無しさん:2005/04/17(日) 10:45:47
339デフォルトの名無しさん:2005/04/17(日) 17:58:16
>>336
鬼車は?
340デフォルトの名無しさん:2005/04/17(日) 21:55:40
free( NULL ) ってまずいんですか?
341デフォルトの名無しさん:2005/04/17(日) 21:56:41
まずくない
342デフォルトの名無しさん:2005/04/17(日) 21:57:18
>>340
馬鹿
343デフォルトの名無しさん:2005/04/17(日) 22:00:17
free(malloc(1));
344デフォルトの名無しさん:2005/04/17(日) 22:23:10
#define HOGE(x,y) (((x) > (y)) ? (x) : (y))
と、括弧で囲うのはどういう意味があるのですか?
副作用がどうたらとの、話は聞いたことがありますが、
HOGE(x++,y++);
と呼び出した場合、これを防げるわけでもありませんし。
345デフォルトの名無しさん:2005/04/17(日) 22:39:06
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
>>345
ありがとうございました。
348デフォルトの名無しさん:2005/04/17(日) 23:12:41
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
setjmp.h はいかが?
350デフォルトの名無しさん:2005/04/17(日) 23:23:59
>>348
スマートとは言いがたいが、こんなのはどう?
void kansu() {
    char *a = 0, *b = 0;
    if (!(a = malloc(1024)) || !(b = malloc(1024))) {
        free(a);
        free(b);
        return;
    }
    /* 処理 */
    free(b);
    free(a);
}
351348:2005/04/17(日) 23:35:05
>>349
すまん。パス。それならgoto使った方がいいと思ったりした。
でもgotoもちょっとアレだし・・・

>>350
それだと、あれかなるほど
aのmallocで失敗した時点でif抜けるからbまでmallocすることはないのか
free(0)って何もしないって規定されてたか。そういえば。なるほど。
352348:2005/04/17(日) 23:36:38
いや、これがmallocだけなら
a=malloc(2048);
b=a+1024;
みたいなのも考えたんだけど
これがmallocじゃなくてなんかのオブジェクト生成だったら
結局似たコードになるよね っていう感じで
じゃあどうしよう、という・・・
353デフォルトの名無しさん:2005/04/17(日) 23:37:21
…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);
}
355348: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);
}
357デフォルトの名無しさん:2005/04/18(月) 00:12:47
>>355
最後にジャンプする前にログ記録するのはだめなのか。
358デフォルトの名無しさん:2005/04/18(月) 00:13:46
>>356
volatileを省略するとどうなるの?
359デフォルトの名無しさん:2005/04/18(月) 00:15:33
>>358
どうもならない
【本当に】 goto を使っている限り
360デフォルトの名無しさん:2005/04/18(月) 00:49:16
>>359
それは、volatileの有無とは関係ない話だろ。
361348:2005/04/18(月) 01:10:52
>>357
冷静に考えたら それで十分だね。 うっへっへ
362デフォルトの名無しさん:2005/04/18(月) 02:44:31
kansu(){
char *a,*b;
a = malloc(1024);
if(a){
b = malloc(1024);
if(b){
//処理
}
}
if(b) free(b);
if(a) free(a);
}
363デフォルトの名無しさん:2005/04/18(月) 03:47:15
kansu()
{
 char *a,*b;
 a=b=NULL;
 if((a = malloc(1024))&&(b = malloc(1024)))
 {
  //処理
 }
 free(b);
 free(a);
}

普通にこれでいいんじゃないの?
364デフォルトの名無しさん:2005/04/18(月) 03:51:36
>>362 は ×。
わざとなのかもしれないけど。
365デフォルトの名無しさん:2005/04/18(月) 12:57:02
double 型の変数で余りの計算ができないのは
どうしてなのですか?
366デフォルトの名無しさん:2005/04/18(月) 13:12:17
div() ldiv()
367デフォルトの名無しさん:2005/04/18(月) 13:17:53
>>366
double違うがな
368デフォルトの名無しさん:2005/04/18(月) 13:22:03
C99でいいなら remainder系だろうな
369デフォルトの名無しさん:2005/04/18(月) 13:58:09
>365
余るのか?
370デフォルトの名無しさん:2005/04/18(月) 14:05:43
5.5%2.5 = 0.5
になって欲しいんじゃないの?
371デフォルトの名無しさん:2005/04/18(月) 14:24:23
>>365
なんで % 演算子じゃなく fmod なんて関数にしたか、って話なら

…俺は知らん。なんでだろね?
372デフォルトの名無しさん:2005/04/18(月) 15:55:05
% 演算子は 「整数」 剰余だからだろ
オペランドが整数か浮動小数点数化で結果が変わる演算子(・A・)イイ!!イクナイ
373デフォルトの名無しさん:2005/04/18(月) 15:55:27
> (・A・)イイ!!イクナイ

どっちだよ orz
374デフォルトの名無しさん:2005/04/18(月) 16:12:13
>>372
加減乗除は?
375デフォルトの名無しさん:2005/04/18(月) 16:50:56
>>374
何も問題無いべ?
376デフォルトの名無しさん:2005/04/18(月) 18:28:53
C言語を始めたいのですがどこから入ればいいですか??

もし、本から入るのが良いのならどの本が分かりやすくて
理解できますか???
377デフォルトの名無しさん:2005/04/18(月) 18:38:25
>>375
言い直そう。
「加減乗除の演算子は整数・実数構わず使用できて
なんで剰余は整数限定なのさ」
378デフォルトの名無しさん:2005/04/18(月) 18:55:05
>>377
じゃあ聞くが、浮動小数でなんで剰余が必要なんだよ
379デフォルトの名無しさん:2005/04/18(月) 19:25:18
>>376
本なら書籍スレがある。
380デフォルトの名無しさん:2005/04/18(月) 19:31:11
擦違いですいません。
381デフォルトの名無しさん:2005/04/18(月) 20:11:02
>>378
…お前、ちょっと黙ってろ。他の人に訊いてんだから。
382デフォルトの名無しさん:2005/04/18(月) 20:19:26
>>381
バカだな
383≠378:2005/04/18(月) 20:24:28
>>381
じゃぁ聞くが、浮動小数点数における剰余を演算子でしなければならない理由は?
384デフォルトの名無しさん:2005/04/18(月) 20:25:50
>>381
はいはーい、他の人やってきましたー
それはですねー ずばり!必要ないからです〜〜〜
385デフォルトの名無しさん:2005/04/18(月) 21:04:21
整数の四則演算もみんな関数にしようよ。
int add(int, int);
int sub(int, int);
int mul(int, int);
int div(int, int);
386デフォルトの名無しさん:2005/04/18(月) 21:16:57
int add(int x, int y) {return x + y;}
387デフォルトの名無しさん:2005/04/18(月) 21:19:02
int sub(int x, int y) {return x - y;}
388デフォルトの名無しさん:2005/04/18(月) 21:24:11
double mod(double x, double y) {return x%y; }
389デフォルトの名無しさん:2005/04/18(月) 21:29:12
>>385
div()は標準ライブラリに存在する。
構造体div_tを使って商・余を同時に返す。
390デフォルトの名無しさん:2005/04/18(月) 21:46:15
Cの動作条件としてよく動作メモリサイズを聞かれるのですが、
これを簡単に計測する方法はないでしょうか?
391デフォルトの名無しさん:2005/04/18(月) 21:48:42
簡単にって時点で解なし
392デフォルトの名無しさん:2005/04/18(月) 22:29:39
>>378
余りを知りたいときじゃない?
fmodなんていう関数もあるんだし、そういう需要はあるんでしょ。
393デフォルトの名無しさん:2005/04/18(月) 22:40:35
>>392
たとえば?
394デフォルトの名無しさん:2005/04/18(月) 22:44:02
#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
395デフォルトの名無しさん:2005/04/18(月) 22:45:44
>>394
ぴったりにはできない。
396デフォルトの名無しさん:2005/04/18(月) 22:53:26
>>394
10000 倍して floor() 呼んで 10000 分の 1 にする。
397デフォルトの名無しさん:2005/04/18(月) 23:01:33
正確にやりたきゃ他の計算ライブラリ使うしかないな
398デフォルトの名無しさん:2005/04/19(火) 00:32:30
C言語でのDinic法のアルゴリズムを探しているのだが、どこにありますかな?
399デフォルトの名無しさん:2005/04/19(火) 01:22:21
>>398
あんたの探してるモノは多分 「アルゴリズム」 じゃない。
400デフォルトの名無しさん:2005/04/19(火) 01:23:48
なるほど、>>399みたいな奴のせいでこの板は初心者に閉鎖的なのか。
401デフォルトの名無しさん:2005/04/19(火) 01:24:10
アルゴリズムが解かったら実装できるやん。なんでやらないの?
402デフォルトの名無しさん:2005/04/19(火) 01:26:53
文法を全て覚えてからやっと初心者が名乗れるんだけど、それすらもできていない奴はまず文法を覚えろ。
403デフォルトの名無しさん:2005/04/19(火) 01:28:09
>>402
なんだ?この基地外は
404デフォルトの名無しさん:2005/04/19(火) 01:31:17
>>403
うるさいもう来るな
405デフォルトの名無しさん:2005/04/19(火) 01:32:11
俺はオナニーに忙しい。お前に構っている暇はない!!!
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);
}
407デフォルトの名無しさん:2005/04/19(火) 03:13:44
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
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
たぶん宿題スレだと思う
411デフォルトの名無しさん:2005/04/19(火) 15:17:14
return に () が付いている本とかたまにありますが、
あれが意図するところは何なのですか?
ただ単に、その人がその方が綺麗とおもうからでしょうか?
412デフォルトの名無しさん:2005/04/19(火) 15:43:44
>>411
宗教。
413デフォルトの名無しさん:2005/04/19(火) 15:58:39
なるほど
414デフォルトの名無しさん:2005/04/19(火) 16:42:52
古代のコンパイラではreturnに()が必要だったらしい。
415デフォルトの名無しさん:2005/04/19(火) 17:51:14
unsigned char abc[100];

のような配列変数の、abc[x]の場所に、int型(2byte)の値を
abc[x] = int型の上位1byte
abc[x+1] = int型の下位1byte
という結果になるように代入したいのですが、
上位と下位に分けて2回代入するのではなく、
一回の代入だけで入れる方法はありますでしょうか。
キャスト等、方法は何でもよいです。

目的は、見た目その他から、一行に収めたいからです。
416デフォルトの名無しさん:2005/04/19(火) 17:59:26
>>415
マクロでも使えば?
417デフォルトの名無しさん:2005/04/19(火) 18:01:22
>>415
見た目・わかりやすさから、
二回に分けて代入した方が良いと思う。
418デフォルトの名無しさん:2005/04/19(火) 19:44:31
共有体とか使ってみれば?
419デフォルトの名無しさん:2005/04/19(火) 19:56:57
>>415
エンディアンの違いがあるから、確実に行うのならば2行に分けたほうが懸命
っていうか、割と環境に依存するから
420デフォルトの名無しさん:2005/04/19(火) 21:01:56
>>418
共用体でしょ?
421デフォルトの名無しさん:2005/04/19(火) 22:09:54
volatile修飾子ってさ
結構使ってる?
422デフォルトの名無しさん:2005/04/19(火) 22:10:50
>>421
またその話かよ
423デフォルトの名無しさん:2005/04/19(火) 22:14:33
>>421
アンケートなら駅前でやれ。
424デフォルトの名無しさん:2005/04/19(火) 22:31:20
俺のプログラム遍歴をみてくれ
C→Java→perl→PHP→C++→C#→C
現在はCに戻ってる。正しい道を教えてくれ
425デフォルトの名無しさん:2005/04/19(火) 22:32:03
>>424
俺のケツをなめろ
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");
}
}
427デフォルトの名無しさん:2005/04/19(火) 22:36:52
>>424
ALGOL系から離れろ
428デフォルトの名無しさん:2005/04/19(火) 22:37:01
>>424
正しい道など無い。必要な時に適切な言語を使うだけのことだ。
解くべき問題の性質にあわせて言語を選ぶ事が肝要なのだから、
一つの言語に依存した考え方よりもより一般化して考える事が重要になってくる。
429デフォルトの名無しさん:2005/04/19(火) 22:37:27
>>426
そういう話は宿題スレでやるものだ
430デフォルトの名無しさん:2005/04/19(火) 22:38:53
あぁ空白が消えてるよ・・
431デフォルトの名無しさん:2005/04/19(火) 22:40:12
あ、スレ違いでしたか。失礼しました。ではそちらに行ってみます
432デフォルトの名無しさん:2005/04/19(火) 22:49:32
>>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) 


   ̄フ 〃
  ̄ ̄フ
    (_
434デフォルトの名無しさん:2005/04/19(火) 22:54:28
再帰を使えばかっこいいと思ってるのか
435デフォルトの名無しさん:2005/04/19(火) 22:54:34
for(m=1;m<(14-k*2);m++){
436デフォルトの名無しさん:2005/04/19(火) 22:57:28
printf("for判定で四則演算カコワルイ");
437デフォルトの名無しさん:2005/04/19(火) 22:59:23
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;
}
438デフォルトの名無しさん:2005/04/19(火) 22:59:49
>>434
再帰の方が保守性が高いと本気で思ってる
439426:2005/04/19(火) 23:00:05
>>435
行きました!ありがとうございます!m(__)m
もっとがんばりますッ
440デフォルトの名無しさん:2005/04/19(火) 23:08:32
>>437
ここは関数型のスレじゃねーんだ
441デフォルトの名無しさん:2005/04/19(火) 23:10:25
初期値付きのローカル変数だけど
手持ちのクロス環境で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がダイレクトに足されてた
これくらいだと、コンパイラが計算しちゃうんだな
442デフォルトの名無しさん:2005/04/19(火) 23:17:19
どう最適かしたのか、オプションは。バージョンは。
443デフォルトの名無しさん:2005/04/19(火) 23:20:51
Cでメモリがほんとにわかっているやつは果たして何人いるんだろうか
くそめためたな入門書を読むたびにそう思うよ
444デフォルトの名無しさん:2005/04/19(火) 23:22:08
>>443
お前だけだよ、そんな奴
445デフォルトの名無しさん:2005/04/19(火) 23:24:20
>>442
コンパイルオプションなし
バージョンは会社のPCなので今調べられない
volatileつけたら、律儀にソースのとおりにやってて
なんか微笑ましかった
446デフォルトの名無しさん:2005/04/19(火) 23:28:10
>>445
だろうね、ポイントはfor文の中身だよ、
ループ回数が判定できる構造になっているのがミソ
しかも4回と小さいので、コンパイラはまず、ループを展開しようとして、
それから計算の依存関係をしらべて、即値として結論している。
447デフォルトの名無しさん:2005/04/20(水) 00:04:39
>>441
そこまでコンパイラが賢いなら
i0,i1,i2,i3,i4は全部スタックにとる必要がないんじゃないか?
448デフォルトの名無しさん:2005/04/20(水) 02:15:08
英語の試験で意訳しすぎて×もらったの思い出した。
449デフォルトの名無しさん:2005/04/20(水) 13:44:37
やっぱりプログラマを目指すならアルゴリズム
を勉強するのは必須かな?
450デフォルトの名無しさん:2005/04/20(水) 14:01:57
>>449
プログラマは目指すものじゃない、なってしまうものだ。
451デフォルトの名無しさん:2005/04/20(水) 15:22:14
こんな廃れた言語使ってる奴って池沼しかいないだろ。
オブジェクト指向のVBが最強だってのに。
452デフォルトの名無しさん:2005/04/20(水) 17:20:53
>>451
もう帰ってくれ
453デフォルトの名無しさん:2005/04/20(水) 18:48:15
C++を学ぶ準備としてCを使えるようになろうとする奴は結構いると思う。
直接C++やればいいのに。
454デフォルトの名無しさん:2005/04/20(水) 18:57:07
うん、でもVBには敵わないけどね
455デフォルトの名無しさん:2005/04/20(水) 19:01:47
ならVBはC++に対してどんな点で敵わないの?
456デフォルトの名無しさん:2005/04/20(水) 19:14:04
>>454
もう帰ってくれ

>>455
お前も
457デフォルトの名無しさん:2005/04/20(水) 19:19:20
>>455
・C++と違って何と言っても小さいファイルサイズ
(ランタイムファイルがなくとも動くソフトは作れる)

・C++と違って参考書類が豊富

・C++と違ってAPIからのルーチン群の取り込みが容易
458デフォルトの名無しさん:2005/04/20(水) 19:35:53
>>457
うむ、釣りご苦労。
459デフォルトの名無しさん:2005/04/20(水) 19:43:55
>>457
もう帰ってくれ

>>458
お前も
460デフォルトの名無しさん:2005/04/20(水) 19:56:26
Cの規格を見れるサイトを知りませんか?
前に見つけた
ISO-IEC JTC1-SC22-WG14 N794
http://www.vmunix.com/~gabor/c/draft.html
が見れなくなってしまって…
他に探しても見つからないし、ひょっとしてもうないですか?
461デフォルトの名無しさん:2005/04/20(水) 19:57:50
>>460
JISのサイトにある
462デフォルトの名無しさん:2005/04/20(水) 20:06:27
>>461
灯台もと暗しorz
馬鹿すぎました…
トンクス
463デフォルトの名無しさん:2005/04/20(水) 20:38:34
JIS=有料という感覚は正しい
464デフォルトの名無しさん:2005/04/20(水) 20:53:22
質問です
2chブラウザを自動的に立ち上げてくれるプログラムを作りたいのですが
C言語でアプリなどを開く関数ってありますか?
DOSで言うstartのようなのです
465デフォルトの名無しさん:2005/04/20(水) 20:59:52
>>464
system()
466デフォルトの名無しさん:2005/04/20(水) 21:00:51
>>464
DOSで言うstartというのは、バッチコマンドのstartのことか?
それならsystem()で起動できる。
467デフォルトの名無しさん:2005/04/20(水) 21:05:29
>>465
あったんですね!!
有難うございます
とりあえずどのヘッダファイルか調べてきます
分からなかったらまたきます
468デフォルトの名無しさん:2005/04/20(水) 21:05:50
>>466
469464: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 ) ;

とかって、プロトタイプ宣言たくさんしても警告すら出してくれないのですが、
どうすればいいですか?
471デフォルトの名無しさん:2005/04/21(木) 12:45:50
>>470
回線切って(ry
472デフォルトの名無しさん:2005/04/21(木) 13:35:10
return 0って何ですか?
473デフォルトの名無しさん:2005/04/21(木) 13:42:53
戻り値が0
474デフォルトの名無しさん:2005/04/21(木) 13:53:37
main関数の戻り値は0でないとだめ?
475デフォルトの名無しさん:2005/04/21(木) 13:55:20
だめじゃないよ
476デフォルトの名無しさん:2005/04/21(木) 14:06:57
C言語の本にはreturn 0とある。main関数に戻り値は必ず必要?そしてそれは整数?
477デフォルトの名無しさん:2005/04/21(木) 14:49:33
>>476
規格に則っているなら必要。そしてそれは整数。OSによっては0以外を返すと一々警告が出るので必要がないなら0を返すべき。
但し、C99はなくてもいいことになってたんじゃないかな。
478デフォルトの名無しさん:2005/04/21(木) 14:56:03
勝手につけてくれるだけだろ
479デフォルトの名無しさん:2005/04/21(木) 14:59:59
>477
C99って何ですか?
480デフォルトの名無しさん:2005/04/21(木) 15:08:46
>>479
規格の一種
JIS ISO C99
でググれ
481デフォルトの名無しさん:2005/04/21(木) 15:31:17
c++にもtryブロックがあると聞いたのですが。
tryが認識されません。
設定の例外処理もちゃんと有効にしているのですが。
もしかして、なにかincludeしないといけないのでしょうか?
ちなみに私はVCコンソールアプリケーションでやっています。
482デフォルトの名無しさん:2005/04/21(木) 15:42:21
c++
483デフォルトの名無しさん:2005/04/21(木) 15:44:34
すみませんスレ違いでした。
484デフォルトの名無しさん:2005/04/21(木) 20:27:33
malloc/freeがスレッドセーフかどうかは決められていないんでしょうか
485デフォルトの名無しさん:2005/04/21(木) 20:45:55
大学でC言語のソースをVC++でコンパイルするのですが、
コマンドライン引数を使用するにはどのようにすればよろしいのでしょうか?
そのまま実行しても入力できずにエラーが返ってきます。
486デフォルトの名無しさん:2005/04/21(木) 20:50:22
コンソールアプリケーションで作ってる?
487デフォルトの名無しさん:2005/04/21(木) 21:01:21
>>485-486
スレ違い。
VC++スレにいっとくれ。
488デフォルトの名無しさん:2005/04/21(木) 21:24:48
K&Rの本はint main(void)じゃなくてmain()だからカスですか?
489デフォルトの名無しさん:2005/04/21(木) 21:31:20
>>488
馬鹿ですね。あなたが。
490デフォルトの名無しさん:2005/04/21(木) 21:32:14
>>489
おまえもな
491デフォルトの名無しさん:2005/04/21(木) 21:34:31
>>488
うわ・・・痛い人だ
意味わかってます?
492デフォルトの名無しさん:2005/04/21(木) 21:36:35
>>484
「スレッド」という概念が標準にありません。
493デフォルトの名無しさん:2005/04/21(木) 21:42:07
>>491
wakaranai
oshiete
494484:2005/04/21(木) 21:42:42
>>492
やっぱりそうですよね
当然割り込みに関して安全かどうかもわからないですよね
マニュアルみるしかないか
495デフォルトの名無しさん:2005/04/21(木) 21:56:21
昔、「情報処理演習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オプション付けてコンパイルすると
実行ファイルのサイズが馬鹿でかくなります。とか平気で言ってたしなー。
496デフォルトの名無しさん:2005/04/21(木) 21:59:47
>>495
あーあ。恥の上塗りしなくていいのに。どうしようもない人間だな。
497デフォルトの名無しさん:2005/04/21(木) 22:03:15
>流行

ン年前の?
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)
と解釈する余地はあると思うのですが、コンパイラはそう解釈しないようです。
499デフォルトの名無しさん:2005/04/21(木) 22:29:30
最長一致
500デフォルトの名無しさん:2005/04/21(木) 22:30:38
>と解釈する余地

ない
前から順番に
+
++
だけ
501デフォルトの名無しさん:2005/04/21(木) 22:36:36
>>500
規格上は後ろからだな。
502500:2005/04/21(木) 22:38:13
>501
知らなかったorz
503デフォルトの名無しさん:2005/04/21(木) 22:41:10
>>498
言語処理乙
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*);
欠点:クライアントコードの変更が多数発生する上に
メモリ確保の度にいちいち情報渡すのが面倒

・スタックフレームの内容を調べる
欠点:環境に依存すると思われる
何よりやり方がよくわからない

皆さんはどうしてます?
505デフォルトの名無しさん:2005/04/21(木) 22:53:30
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);

でいいんじゃ?
506デフォルトの名無しさん:2005/04/21(木) 22:57:01
>orig_malloc
マクロに汁

__LINE__とか__FUNC__を渡せるやつは別の名前に!
507デフォルトの名無しさん:2005/04/21(木) 23:13:52
>>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);
}
508504:2005/04/21(木) 23:19:40
>>506
>>507
おぉ!なるほど
mallocをマクロで上書き?するのに軽い罪悪感を感じますが

orig_mallocを同じ様にすれば無問題すね

ありがとんです
509デフォルトの名無しさん:2005/04/21(木) 23:50:58
a > 9 ? b = 0 : 0 ;
ってな具合に三項演算子のelse に当たる部分で何もしたくない時、
: 0 ってやってますが、他になにかもっとスマートというか、そんなやりかたないですか?
510デフォルトの名無しさん:2005/04/21(木) 23:51:55
>何もしたくない時

すなおに if() で掻けや(w
511デフォルトの名無しさん:2005/04/21(木) 23:56:45
?とか使いたかったです。
512デフォルトの名無しさん:2005/04/22(金) 00:05:16
>>509
a > 9 && (b = 0);
513デフォルトの名無しさん:2005/04/22(金) 00:18:16
おぉ・・・そんな手があったとゎ。
514デフォルトの名無しさん:2005/04/22(金) 00:21:51
なんかperlとかシェルスクリプトみたいだな
515デフォルトの名無しさん:2005/04/22(金) 00:24:40
今まで何気なく構造体を初期化するとき、
struct hoge a = { 0 } ;
としていました。自分が所持しているコンパイラでは全部0で初期化
されるのですが、これは配列と同等で、保障されているのものなのでしょうか?
516デフォルトの名無しさん:2005/04/22(金) 00:28:05
されてます
517デフォルトの名無しさん:2005/04/22(金) 00:28:31
>>515
されている。次。
518デフォルトの名無しさん:2005/04/22(金) 00:30:06
構造体のメンバによるんじゃ?

double とかって大丈夫だったっけ
519デフォルトの名無しさん:2005/04/22(金) 00:35:47
もし何かのヘッダファイルのインクルードを失敗したら、
とかって、条件分岐させたいのですが、大体ファイルの先頭のインクルードガード
#ifndef __XXX_H__
#define __XXX_H__
:
#endif
どれ見てもこの形式になっているように思いますが、
これは規格とかで決まっているものなのですか?
520デフォルトの名無しさん:2005/04/22(金) 00:37:39
>>519
失敗したときに条件分岐できるのか?
コンパイルエラーになるだけじゃないの?
521デフォルトの名無しさん:2005/04/22(金) 00:43:17
>これは規格とか

ってゆーか知恵だ 同じヘッダファイルを何度もincludeして何度も定義しないようにするため
522デフォルトの名無しさん:2005/04/22(金) 00:49:54
なんというか、この #define __XXX_H__ 定義の、 __XXX_H__
アンダースコア2個、ファイル名、H、アンダースコア2個という
命名規則があるのかなぁ、と思ったです。そうしたほうがやりやすそうな気がして。

>>520さんがおっしゃるよう、確かにそうですね_| ̄|○
どうか聞き流してください。
523デフォルトの名無しさん:2005/04/22(金) 00:50:51
>>519
先頭がアンダーバーで始まる名前は使うな。
524デフォルトの名無しさん:2005/04/22(金) 00:52:14
>>519
つまりは__もダメ
525デフォルトの名無しさん:2005/04/22(金) 00:53:25
わかりました。
526デフォルトの名無しさん:2005/04/22(金) 01:04:53
よく思い出したら、お礼書いてなかった。
レスありがとうございましたです!
527デフォルトの名無しさん:2005/04/22(金) 01:05:22
俺は
#ifndef FILENAME_H_INCLUDED
ってしてる
528デフォルトの名無しさん:2005/04/22(金) 08:20:05
俺は
#ifndef NULLPO
ってしてる
529デフォルトの名無しさん:2005/04/22(金) 09:06:25
プログラミングの仕方ってどうやるんですか?
#include 〜をメモ帳に書いたんですが、それの実行させる仕方が分りません。
基本的なことですがお願いします。
530デフォルトの名無しさん:2005/04/22(金) 09:47:58
>>529
釣れますか?
531デフォルトの名無しさん:2005/04/22(金) 10:28:52
>>530
本当に分からないんですorz
今C言語の本読んでるんですが分かりません
532デフォルトの名無しさん:2005/04/22(金) 11:02:33
>>531
選んだ本が悪かったね

まずは>>1以下のテンプレ読んでおいで
あとgoogleで「c言語 入門」とか検索すれば出てくる
自分で調べるクセをつけておくと、今後役に立つので、がんばれ
533デフォルトの名無しさん:2005/04/22(金) 11:05:04
本のせいにするなよ
534dふぁ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 ;}
↑を実行するとセグメントエラーと出ます。
セグメントエラーってなんですか?
535デフォルトの名無しさん:2005/04/22(金) 11:55:34
>>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)
536デフォルトの名無しさん:2005/04/22(金) 12:42:26
537デフォルトの名無しさん:2005/04/22(金) 12:44:53
あはは、エピたんに怒られてやんの。
538529:2005/04/22(金) 13:01:55
すいません、もう1つお願いします。
自分が言ってたのはコンパイルするってことですか?
539デフォルトの名無しさん:2005/04/22(金) 13:11:07
>>538
スレ違い、いや板違いかもしれん。
頼むから日本語で質問してくれ。できれば初心者スレで。
540デフォルトの名無しさん:2005/04/22(金) 13:51:37
急速にスレの質が低下してまいりました
541デフォルトの名無しさん:2005/04/22(金) 14:21:52
>>540
はぁ? 元からだろ。
542デフォルトの名無しさん:2005/04/22(金) 14:25:43
>>541
多分、お前の所為。
543200:2005/04/22(金) 16:17:26
>>542
死ね。
544デフォルトの名無しさん:2005/04/22(金) 16:28:07
急速にスレの質が低下してまいりました
545デフォルトの名無しさん:2005/04/22(金) 16:34:55
所詮Cグラマだし
546デフォルトの名無しさん:2005/04/22(金) 16:35:39
  _   ∩
( ゚∀゚)彡 ちんこ!ちんこ!
 ⊂彡
547546:2005/04/22(金) 16:36:41
すまん、誤爆した。
548デフォルトの名無しさん:2005/04/22(金) 16:54:11
流れにふさわしい誤爆じゃ
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
550デフォルトの名無しさん:2005/04/22(金) 18:45:07
>>549
char (*char_list_tbl[])[32]
551549:2005/04/22(金) 19:13:05
>>550
なんでそーなるのか答えを見てもサッパリ分からないけど、やってみたら出来ました。

ありがとう。
お前が最高に輝いて見えるよ。。。
552デフォルトの名無しさん:2005/04/22(金) 19:16:17
>>551
氏ねよ
553デフォルトの名無しさん:2005/04/22(金) 19:22:21
急速にスレの質が低下してまいりました
554デフォルトの名無しさん:2005/04/22(金) 19:23:24
>550
エラー出るよ...
555デフォルトの名無しさん:2005/04/22(金) 19:30:52
>>553
はぁ? 元からだろ。
556デフォルトの名無しさん:2005/04/22(金) 19:51:43
>>555
多分、お前の所為。
557デフォルトの名無しさん:2005/04/22(金) 22:10:58
dejavu?
558デフォルトの名無しさん:2005/04/22(金) 22:12:52
d?Pj?A vu
559デフォルトの名無しさん:2005/04/22(金) 22:17:35
炎の杖で書いとけば消えないよ
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のランダムな数を代入したいのですが、上の書き方だと
うまく入ってくれません。
よろしければどなたかよろしくお願いします。
561デフォルトの名無しさん:2005/04/22(金) 23:03:35
>>560
_gadad `ifdjd
562デフォルトの名無しさん:2005/04/22(金) 23:05:03
1+rand()%10
563デフォルトの名無しさん:2005/04/22(金) 23:07:03
>>560
>*((*cp + j) + i)

よく見てないけど、*(*(cp + j) + i) じゃない?
cp[j][i] の方がいいと思うけど。
564デフォルトの名無しさん:2005/04/22(金) 23:11:02
>>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が消えてる
568デフォルトの名無しさん:2005/04/22(金) 23:51:59
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型に小数点付けようとしてるからだ
570デフォルトの名無しさん:2005/04/23(土) 00:21:52
> printf("10000: %d\n",10000-(12*9+15*7)*1.05);

printf("10000: %f\n",10000-(12*9+15*7)*1.05);
571568:2005/04/23(土) 00:37:00
>>569
即レスどうもありがとうございます。とりあえず↓なようにして小数点を削ってみたらちゃんとできました。
printf("10000: %d\n",10000-(12*9+15*7)*105/100);

これからlong intやfloatの使い分けを理解しようと思います(そういう問題じゃないのかな

どうもありがとうございました
572568:2005/04/23(土) 00:40:17
>>570さんもありがとうございます

やっぱり%fや%dの部分なんですね
調べるのにすごい時間がかかってしまいました^^;
573デフォルトの名無しさん:2005/04/23(土) 08:47:39
>>560
けちけちするな。int使え。
574デフォルトの名無しさん:2005/04/23(土) 10:56:34
けちけちするな。_int64使え。
575デフォルトの名無しさん:2005/04/23(土) 14:49:52
すみません、質問なんですけど
ここの部分の判定がなされてないみたいなのですが

if(a == b == c)printf("0000");

書き方がおかしいのでしょうか?
576デフォルトの名無しさん:2005/04/23(土) 14:53:35
>>575
if (a==b&&a==c) …
==演算子は二項演算子だ。
577デフォルトの名無しさん:2005/04/23(土) 14:53:45
(a==b) && (b == c) じゃだめなんすか?
578デフォルトの名無しさん:2005/04/23(土) 14:54:07
>>577
いいよ。
579デフォルトの名無しさん:2005/04/23(土) 14:58:44
>>578
ありがとうございました
580デフォルトの名無しさん:2005/04/23(土) 15:04:05
>>579
あんた誰だよ
581575=579:2005/04/23(土) 15:27:23
>>580
577は僕じゃないです。^^;
コンパイル通りましたんで、関係演算子と論理演算子を研究してみたいと思います
ありがとうございました
582デフォルトの名無しさん:2005/04/23(土) 15:41:03
>>581
それよりももっと重要で汎用的な知識として型理論も研究した方がいい。
583デフォルトの名無しさん:2005/04/23(土) 15:46:27
ヒント
(a == b) == c
584デフォルトの名無しさん:2005/04/23(土) 15:49:11
>>583
意味不明
585デフォルトの名無しさん:2005/04/23(土) 16:13:52
>>583が一番低レベルだなw
586デフォルトの名無しさん:2005/04/23(土) 16:15:32
モノレールの阪大病院前と阪急の北千里、
どっちで降りたほうが道が分かりやすいですか?
587デフォルトの名無しさん:2005/04/23(土) 16:16:18
>>586
北千里。
588デフォルトの名無しさん:2005/04/23(土) 16:18:33
>>587
Thanks.
589デフォルトの名無しさん:2005/04/23(土) 16:20:08
それに阪急の方がやすいし。
590デフォルトの名無しさん:2005/04/23(土) 16:22:21
つぎ。
591デフォルトの名無しさん:2005/04/23(土) 16:47:04
以下、矢印キーを押されたら、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 だと思っていたのですが。
592デフォルトの名無しさん:2005/04/23(土) 16:49:57
>>591
signedなcharはintにキャストされると0xffffffe0になる。それは即ち、-32。
593デフォルトの名無しさん:2005/04/23(土) 16:55:27
おぉ、すばらしい。
ここで訊いて正解でした。ありがとうございます。
594デフォルトの名無しさん:2005/04/23(土) 18:24:51
「プロジェクトを完了させてから事故死」
とか書いてもきっとすぐに心臓麻痺で死ぬんだろうな。
595デフォルトの名無しさん:2005/04/23(土) 18:38:01
なんで始めからintで受けないの?
596デフォルトの名無しさん:2005/04/23(土) 18:47:37
>>591
case '\xE0':と書けばcharがsignedかどうか気にする必要がなくなる。
597デフォルトの名無しさん:2005/04/23(土) 18:49:01
>>595が今いいこと言った!
598デフォルトの名無しさん:2005/04/23(土) 19:31:25
NaNって何ですか?
どこに定義されてるんですか?
599デフォルトの名無しさん:2005/04/23(土) 19:41:08
600デフォルトの名無しさん:2005/04/23(土) 19:54:37
NaNとジョー先生
601デフォルトの名無しさん:2005/04/23(土) 19:56:35
だじゃれだろ、笑ってやれよ
602デフォルトの名無しさん:2005/04/23(土) 20:25:03
はっはっはっ
603デフォルトの名無しさん:2005/04/23(土) 22:35:09
#define ADD( m , n ) ( (m) + (n) )
のようなマクロ関数を使うとき、(m,n) という具合に、スペースは入れないほうが
よいと教えられました。では逆にスペースをいれることによって起こり得るバグとは
どのようなものがあるのでしょうか?
考えても思いつきません。
604デフォルトの名無しさん:2005/04/23(土) 22:36:43
>>603
まずは
 入れるなと言った奴に
  聞いて来い
605デフォルトの名無しさん:2005/04/23(土) 22:41:05
>>603
入れるのはそこじゃないわよ♥
606デフォルトの名無しさん:2005/04/23(土) 22:47:50
入れるなと
 言った奴に
  聞いたとて
   彼もまた
    誰かに聞いて
     そうしてる
607デフォルトの名無しさん:2005/04/23(土) 22:49:48
低脳の螺旋だな
608デフォルトの名無しさん:2005/04/23(土) 22:58:26
>>603
バグが起こるとかそういう問題ではない。単にお前の空白の置き方が不自然なだけ。

ちなみにこれが俺流。比較的広く通用すると俺は思っている。
#define ADD(m, n) ((m) + (n))
609デフォルトの名無しさん:2005/04/23(土) 23:01:19
#define ADD (m,n)((m)+(n))
(゚∀゚)アヒャヒャヒャ
610デフォルトの名無しさん:2005/04/23(土) 23:05:31
611デフォルトの名無しさん:2005/04/23(土) 23:05:59
612デフォルトの名無しさん:2005/04/23(土) 23:08:10
手動で貼り付ける意味がわからない
613デフォルトの名無しさん:2005/04/24(日) 03:46:01
これのどこらへんが危険なのですか?
main(int argc, char *argv[])
{
printf(argv[1]);
}
614デフォルトの名無しさん:2005/04/24(日) 04:09:27
むかし公開されてたCmachine探してるんだけど、
誰かもってない?あったらUPしてもらえる助かる。
615デフォルトの名無しさん:2005/04/24(日) 04:10:02
>>613
% program hello%s
616デフォルトの名無しさん:2005/04/24(日) 04:27:19
>>613
int渡す意味があるのか
ポインタに配列指定してるのか

意味分んねぇ
617デフォルトの名無しさん:2005/04/24(日) 05:23:31
>>616 の発言が意味わからない。

>>613
printf("%s%d%f"); これが安全だと思うなら安心して使えばよい。
618デフォルトの名無しさん:2005/04/24(日) 08:17:38
>>613
そもそもargcが1ということもありえる。
619デフォルトの名無しさん:2005/04/24(日) 08:22:09
>>614
あんなゴミ、何に使うの?
620デフォルトの名無しさん:2005/04/24(日) 09:22:05
ビル・ジョブスさんって
もういないんですか?
621デフォルトの名無しさん:2005/04/24(日) 10:38:11
>>620
あなたの心の中でぬるぽしてます。
622デフォルトの名無しさん:2005/04/24(日) 10:46:38
>>613
リターンしてないから警告が出るんじゃね?
623デフォルトの名無しさん:2005/04/24(日) 13:27:46
/* 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のアンサーブックの答えとは違っていました。
このアルゴリズムだと何か問題ありますか?
624デフォルトの名無しさん:2005/04/24(日) 14:03:52
>>623
引数の n が 0 の時、どうするよ?
625デフォルトの名無しさん:2005/04/24(日) 14:19:29
>>624
int nではなく、unsigned nにすればいいw
626デフォルトの名無しさん:2005/04/24(日) 14:23:05
>>622
低脳はだまれ ボケボケボケボケボケボケボケ!!
627デフォルトの名無しさん:2005/04/24(日) 14:29:18
>>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
あめぞうを潰せませんか?
629デフォルトの名無しさん:2005/04/24(日) 14:35:10
>>627
>そこを変更したことによって動作に問題が無いかというのを見て欲しいです。

だから実際起きているだろ?
n == 0 の時。
630デフォルトの名無しさん:2005/04/24(日) 14:44:51
正しく動作しているなら、元の動作を変えてはいけない
これ常識
631デフォルトの名無しさん:2005/04/24(日) 15:11:46
すいません。やっと分かりました…。
元のソースでも変更後のソースでも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] )に変更すれば、あとは大丈夫ですか?
632デフォルトの名無しさん:2005/04/24(日) 17:02:58
>>631
>n==0なのに、返値-1以外を返してしまう可能性が
>変更後のソースにはあるから問題があるということですか?

もちろん-1以外を返す可能性もあるが、
それ以前に v の要素数が 0 なのに v[0] を読み込んでいる時点で
OSが領域外のメモリアクセスを検知して、
そのプログラムの実行が強制的に中止させられていても
文句を言えない、というレベルの代物。

>if ( low == high && x== v[low] )に変更すれば、あとは大丈夫ですか?

とりあえず大丈夫そうだが、無駄な処理が多い。
元のソースの方が、ずっとスマート。
633デフォルトの名無しさん:2005/04/24(日) 17:15:09
>>631
そそ、藻前様の工夫は見難くなるだけで効率もさして変わらない。
つまり、「改良」にはなってないわけだ。
634デフォルトの名無しさん:2005/04/24(日) 17:38:59
配列で質問があります。
int x[5];を初期化する場合
int x[5] = {1,1,1,1,1};
で出来ますが、初期化以外で同じ値を入れる場合は、for文などの繰り返し処理か、x[0] = 1,x[1] = 1・・・・;のように一つずつ書く方法しかないんですか?
635デフォルトの名無しさん:2005/04/24(日) 17:41:02
static int x[5] = {1,1,1,1,1};
みたいなのを用意しておいて
memcpy
636デフォルトの名無しさん:2005/04/24(日) 17:42:24
>>635
それで何か得なことがあるわけ?
637デフォルトの名無しさん:2005/04/24(日) 17:52:12
for文で回すよりたいていは速いだろ
638デフォルトの名無しさん:2005/04/24(日) 18:01:46
すいません、ちょっとお聞きしたい事があるのですが、
char s[80]={"1 50 20 20 50"};
と宣言した文字配列を数字として取り出すことはできるでしょうか?
最初の1桁の数字を科目コードとして、
残りのスペースで区切られた2桁の数字を点数として取り出したいのですが・・・
639デフォルトの名無しさん:2005/04/24(日) 18:03:15
>>637
そう? 根拠は?
速度が問題になるほどのデータ量なら、単純に考えると代入ループよりも遅くなると思うのだけど。
640デフォルトの名無しさん:2005/04/24(日) 18:04:29
>>638
sscanf()を使え。
strtok()でもいいが。
strtol()で頑張ってもいいかも知らん。
atoi()だけじゃ無理だがな。
641デフォルトの名無しさん:2005/04/24(日) 18:06:42
>>640
素早いご返答ありがとうございます、早速試してみますね(*´∀`)
642デフォルトの名無しさん:2005/04/24(日) 18:08:01
>>639
>速度が問題になるほどのデータ量なら、単純に考えると代入ループよりも遅くなると思うのだけど。
そうなの?なんで?
643デフォルトの名無しさん:2005/04/24(日) 18:17:53
CPUやコンパイラによるわな
気になるなら自分でアセンブルリスト見ろって感じだよ
memcpyだけは選ばないけどさ。
644デフォルトの名無しさん:2005/04/24(日) 18:21:10
>>632
とても勉強になりました。わざわざ詳しいレス本当にありがとうございます。
>>633
これくらいの違いなら他人が見たときの見やすさの方が大切なんですね。
645デフォルトの名無しさん:2005/04/24(日) 18:41:57
>>642
>639が言いたいのはこういうことだろう。
代入ループ:データ(レジスタor即値)→メモリ
コピーループ:メモリ→(レジスタ)→メモリ
しかし、速度が問題になるような量なら、そもそも後者は現実的ではないので、>639は極論。
まぁ、要は>643ってこった。
646デフォルトの名無しさん:2005/04/24(日) 19:50:17
サイズさえ合ってれば、wmemsetでいいんじゃないの?
647デフォルトの名無しさん:2005/04/24(日) 22:26:40
>>626
なんだこの糞ヲタ
モンクあんのかよ
648デフォルトの名無しさん:2005/04/25(月) 00:52:55
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
すいません、長くなりましたがよろしくお願いします
656デフォルトの名無しさん:2005/04/25(月) 08:38:14
>>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
今度のテストでアルゴリズムが問題に入ると言われました、演算をしろ
ということなんですかね?
660デフォルトの名無しさん:2005/04/25(月) 11:31:58
>>658
スレ違い。
そんな非標準の関数の仕様など、環境依存スレで聞いてくれ。
printf()互換ならば、unsigned longの変換指定だが。

>>659
スレ違い。
アルゴリズムはCではない。アルゴリズムを実装する手段としてCを使うと言う話なら別だが。
661デフォルトの名無しさん:2005/04/25(月) 11:56:43
>>660
すいません、アルゴリズムを実装する手段としてCを使うと言う
事です。その場合、flow chartをもらってそこからCを書いたりとか
の可能性がおおきいですかね?
662デフォルトの名無しさん:2005/04/25(月) 12:36:28
>>661
先生に聞けばいいんじゃないの?
663デフォルトの名無しさん:2005/04/25(月) 14:15:18
>>662
aho?
664デフォルトの名無しさん:2005/04/25(月) 14:30:42
指定の"%i"って何でしょうか?
665デフォルトの名無しさん:2005/04/25(月) 14:34:55
  ( ^ω^) ウーン・・・
  (⊃⊂)
666デフォルトの名無しさん:2005/04/25(月) 14:53:55
>>664
マニュアルを紐解くと言う能力はないの?
667デフォルトの名無しさん:2005/04/25(月) 15:51:02
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);

お願いします。
668デフォルトの名無しさん:2005/04/25(月) 16:14:49
>>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);
669667: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 }
に近いノリ
672デフォルトの名無しさん:2005/04/25(月) 21:25:37
>>670
前置は、C++にレベルアップするための準備。
673デフォルトの名無しさん:2005/04/25(月) 21:28:23
++C
674デフォルトの名無しさん:2005/04/25(月) 21:54:23
>>672
そのつもりで俺も++i派だが
いつになってもC++にレベルアップしないんだよな
絶対負け組だよ俺
675デフォルトの名無しさん:2005/04/25(月) 22:00:39
>>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
レベルアップってなバイアスかかってる時点で終わってるな
なに言っても無駄、もうあきまへんわ
679デフォルトの名無しさん:2005/04/25(月) 22:32:09
>>677
struct data hoge;

rank1(&hoge,5);
680デフォルトの名無しさん:2005/04/25(月) 22:33:01
>>677

struct data a[100];
rank1(a, 100);
681デフォルトの名無しさん:2005/04/25(月) 23:04:03
>>679-680
ありがd
課題が何とか終わりそう
682デフォルトの名無しさん:2005/04/25(月) 23:11:31
Cmachineお持ちの方いらっしゃいましたらUPお願いします。
683デフォルトの名無しさん:2005/04/25(月) 23:43:06
microsoft.netのコンパイラを使っているのですが、
アセンブリ言語のコードを生成するコンパイラオプションを教えてください。
684デフォルトの名無しさん:2005/04/25(月) 23:49:51
>>683
アホか?
685デフォルトの名無しさん:2005/04/25(月) 23:53:54
>>683
MSVCではアセンブリ吐かない。gcc使え。
686デフォルトの名無しさん:2005/04/26(火) 00:02:25
またgcc厨が涌いてきたよ
687デフォルトの名無しさん:2005/04/26(火) 00:05:15
>>686
厨ってなんだ?「〜が好きな人」という意味か?
688デフォルトの名無しさん:2005/04/26(火) 00:05:29
/FA じゃあかんの?
689デフォルトの名無しさん:2005/04/26(火) 00:06:40
俺、トマトジュース厨。 あいつ、さとう珠緒厨。
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言語初心者です。お忙しいと思いますが、皆様おしえてください。

 

691デフォルトの名無しさん:2005/04/26(火) 00:29:58
文字と数字の文字列から数字を抜いて表示する関数ですが、
コンパイルエラーは出ないものの実行してみると何も表示されません。
読み込んだ文字列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);
}
692デフォルトの名無しさん:2005/04/26(火) 00:30:20
CSV大人気
693デフォルトの名無しさん:2005/04/26(火) 00:32:11
>>690
fgets()で1行読み込んで、
sscanf()を駆使するか、strtok()で頑張るかして自分で構造体に格納する。
694デフォルトの名無しさん:2005/04/26(火) 00:33:51
>>691
str[]とback[]のインデックスが同じままではbackに隙間ができてしまうではないか。
制御変数をもう一つ使ってループせよ。
695デフォルトの名無しさん:2005/04/26(火) 00:33:54
F/A-18C
696デフォルトの名無しさん:2005/04/26(火) 00:36:39
m9(^Д^)プギャー
697デフォルトの名無しさん:2005/04/26(火) 00:37:01
>>691
>if(str[i] < '0' && '9' < str[i])

if (0)
って書きなおしたら?
698デフォルトの名無しさん:2005/04/26(火) 00:37:22
>>691
void del(char* str) {while(*str) {if (!isdigit (*str)) putchar (*str); str++;}}
699デフォルトの名無しさん:2005/04/26(火) 00:38:13
>>691
無駄が多すぎんだよ。なんだよbackて。100文字越えたらどうすんだよ。
700デフォルトの名無しさん:2005/04/26(火) 00:52:59
>>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
即レスありがとうございました。
定義したエリアに値を格納しないと使えないっつーことですね。
構造体を作ったら、ファイル作って、ファイルポインタかなんかで
関連つけることばかり考えてました。
ありがとうございました。
702デフォルトの名無しさん:2005/04/26(火) 01:26:58
void del_digit(char * str)
{
for(;*str;++str) if (!isdigit(*str)) putchar(*str);
}

703デフォルトの名無しさん:2005/04/26(火) 05:46:22
>>693
頭悪スレが似合いだよ
704デフォルトの名無しさん:2005/04/26(火) 12:41:56
sscanf()を駆使する!!!!!!
705デフォルトの名無しさん:2005/04/26(火) 13:49:41
急速にスレの質が低下してまいりました
706デフォルトの名無しさん:2005/04/26(火) 14:34:11
C言語なら他所で聞け!
707デフォルトの名無しさん:2005/04/26(火) 14:49:25
すいません、ちょっと訊きたいのですが

ttp://www.geocities.co.jp/SiliconValley-Oakland/8878/lab17/lab17.html
ここにあるmd5のソースって

>strncpy((char *)padding_message, (char *)pstring, copy_len);
ここでスタイルキャストしてるから制御文字含んだファイルのハッシュ値が合わなくないですか?

708デフォルトの名無しさん:2005/04/26(火) 16:19:07
スタイルキャストって何?
709デフォルトの名無しさん:2005/04/26(火) 16:43:05
>>705
まだ低下するのか
710707:2005/04/26(火) 16:45:04
解決しますた
711デフォルトの名無しさん:2005/04/26(火) 16:49:15
>>707
それC++。
C++ではcharとsigned charとunsigned charは別物扱いだからキャストしないとコンパイルできない。
712デフォルトの名無しさん:2005/04/26(火) 17:34:10
>>709
もっともっと下がります
713デフォルトの名無しさん:2005/04/26(火) 17:45:23
スタイルキャストって何ーーーーーーー?
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
と出力する.
715デフォルトの名無しさん:2005/04/26(火) 17:47:59
>>714
ふざけんなボケ。自分でやれ。
716デフォルトの名無しさん:2005/04/26(火) 17:52:49
> 作成してください

死ね。
717デフォルトの名無しさん:2005/04/26(火) 17:57:32
>>714
宿題は宿題スレへ。宿題は俺に訊くな!
718Addicted to C++ ◆nrBjarne.g :2005/04/26(火) 18:23:25
>>714
こっちへ移動してね

ぼるじょあがC/C++の宿題を片づけますYO! 42代目
http://pc8.2ch.net/test/read.cgi/tech/1113811213/
719デフォルトの名無しさん:2005/04/26(火) 19:09:58
http://hp.kutikomi.net/xxshinntarouxx/
このしょっぱいHPにF5を・・・・。
720デフォルトの名無しさん:2005/04/26(火) 19:16:48
>>719
宣伝乙
721デフォルトの名無しさん:2005/04/26(火) 19:20:42
ABS関数やIFを使わないで絶対値を求めるにはどうすればいいですか
722デフォルトの名無しさん:2005/04/26(火) 19:25:26
>>721
#define abs(a) ((a)>=0?(a):-(a))
を一行入れておく。これは関数では無い。
723デフォルトの名無しさん:2005/04/26(火) 19:32:08
abs(num++); とかや?%</fo2黷スりして
724723:2005/04/26(火) 19:32:28
化けた orz
725デフォルトの名無しさん:2005/04/26(火) 19:33:20
C言語入門終えた程度の初心者ですけども
興味のあるlameのソースを見て勉強しようかなと思っています。
これ、勉強になるソースですか?難易度はどの程度でしょうか?
726デフォルトの名無しさん:2005/04/26(火) 19:34:02
>>721
> ABS関数

C に「ABS関数」は存在しない。

> IF

C に「IF」は(ry
727デフォルトの名無しさん:2005/04/26(火) 19:34:05
>>725
とりあえず、mp3のエンコーディングの勉強しようか。
728デフォルトの名無しさん:2005/04/26(火) 19:34:07
IEEE形式浮動小数点なら、ビット演算一つで済む。
729デフォルトの名無しさん:2005/04/26(火) 19:35:00
abs は #ifndef __cplusplus で囲ってくれ…
730721:2005/04/26(火) 21:10:09
>>722
>>726
説明不足ですいません
((a)>=0?(a):-(a))みたいな条件式やabs関数よりも早く処理する方法があるといわれてそれを探してるんです
ビット演算で出来るらしいんですけど、ヒントでいいんで何か助言してもらえないでしょうか
731デフォルトの名無しさん:2005/04/26(火) 21:11:48
>>730
環境依存
732デフォルトの名無しさん:2005/04/26(火) 21:12:00
>>730
言った奴に聞けよ
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
構造体のメンバ変数の数を知る関数、もしくは良い方法は
ないものでしょうか?
735デフォルトの名無しさん:2005/04/26(火) 22:20:22
むりだ、そら。
736デフォルトの名無しさん:2005/04/26(火) 22:21:33
>>734
全てのメンバのサイズが同じなら、構造体のサイズから計算はできる。しかし、他に適当な方法はない。
737デフォルトの名無しさん:2005/04/26(火) 22:21:34
あ、がっかり・・・
738デフォルトの名無しさん:2005/04/26(火) 22:24:13
>>730
IEEE形式の浮動小数点数限定。
#define FABS(x) (*(int64_t *)&(x) | 0x7fffffffffffffff)
単精度ならint32_t *、倍精度ならint64_t *辺りを使えば良いと思う。

1の補数を使っていれば整数にも使える。その場合はポインタを経由せずに直接キャストしてよい。
739デフォルトの名無しさん:2005/04/26(火) 22:31:38
>734
C++でテンプレートとマクロを駆使すれば可能、
という実験をした覚えがある。
740デフォルトの名無しさん:2005/04/26(火) 22:32:39
普通にヘッダさかのぼろうぜ
741デフォルトの名無しさん:2005/04/26(火) 22:37:38
>>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);
}
742デフォルトの名無しさん:2005/04/26(火) 22:39:49
面白いな。
でも、あらかじめ準備するんだったら、方法はいろいろある。

既存の構造体を渡されて、メンバいくつかといわれたら一般には無理。
743デフォルトの名無しさん:2005/04/26(火) 22:54:20
stringがたの文字の消去ってどうやってやるのですか。
テキストから読み込んだ文字を1行消したいのですが
744デフォルトの名無しさん:2005/04/26(火) 22:57:00
>>743
そんなプリミティブ型は存在しません。
char型アレイの事かい?
745デフォルトの名無しさん:2005/04/26(火) 23:06:44
1+1/2^2+1/3^2+・・・+1/1000^2
を計算せよ。

という問題がわかりません。どなたかご教授下さい。
746デフォルトの名無しさん:2005/04/26(火) 23:11:11
宿題は宿題スレへ。
747デフォルトの名無しさん:2005/04/26(火) 23:14:49
>>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;
}
748デフォルトの名無しさん:2005/04/26(火) 23:20:30
なるべく宿題スレに誘導してくれよ
また似たようなのが来ちゃうよ
749デフォルトの名無しさん:2005/04/27(水) 00:00:28
テンプレに 「C++ はスレ違い」 って書いて欲しいな
750デフォルトの名無しさん:2005/04/27(水) 00:18:30
UNIX(HP-UX)でどでかいファイルの読み込みアプリです。
出力メッセージを

 ファイル読み込み中・・・1%
 ファイル読み込み中・・・2%
 ファイル読み込み中・・・3%

みたいにつらつらメッセージが表示されるんじゃなく

 ファイル読み込み中・・・1%
                ~~この数値のみ変化する

みたいにしたいんだけど
なんか良いAPI or 手段ってあるかしら
751デフォルトの名無しさん:2005/04/27(水) 00:21:13
>>750
'\r'
752デフォルトの名無しさん:2005/04/27(水) 00:23:12
コンソールなら、"\r"で同一行に表示したら?
753デフォルトの名無しさん:2005/04/27(水) 00:29:30
\b
754デフォルトの名無しさん:2005/04/27(水) 00:54:46
>>753
それでいいのか?
755デフォルトの名無しさん:2005/04/27(水) 02:50:48
\a
756デフォルトの名無しさん:2005/04/27(水) 03:38:14
えんいー
757デフォルトの名無しさん:2005/04/27(水) 04:37:31
&harts;
758デフォルトの名無しさん:2005/04/27(水) 04:38:49
759デフォルトの名無しさん:2005/04/27(水) 08:35:34
急速にスレの質が低下してまいりました
760デフォルトの名無しさん:2005/04/27(水) 08:44:50
おやつの昆布、全部食べちゃいました。
どうしたらいいですか?
761デフォルトの名無しさん:2005/04/27(水) 08:45:19
死ねばいいと思うよ
762デフォルトの名無しさん:2005/04/27(水) 08:45:58
>>760
もう一袋買ってくる
763デフォルトの名無しさん:2005/04/27(水) 08:47:42
>>760
#include <stdio.h>

int main(void)
{
  printf("Hello, world!\n");
  return 0;
}
764デフォルトの名無しさん:2005/04/27(水) 08:48:12
int main(void)
{
if (!昆布) {
買う(昆布);
}

食べる(昆布)

return 0;
}
765デフォルトの名無しさん:2005/04/27(水) 08:48:54
int main(void)
{
  おやつ 昆布;
  for(; ; )
  {
    if (!昆布)
      買う(昆布);
    食べる(昆布)
}
return 0;
}
766デフォルトの名無しさん:2005/04/27(水) 08:49:31
>>760
頑張れ!!
767デフォルトの名無しさん:2005/04/27(水) 09:11:27
dejavu?
768デフォルトの名無しさん:2005/04/27(水) 13:23:11
キーボードから自然数nを入力して1からnまでの7の倍数の和を求める
プログラムをさくせいするのだがいまいちわかりません

7の倍数てのはどう表現すればいいんですかねぇ?
769デフォルトの名無しさん:2005/04/27(水) 13:31:31
>>768 小学校からやり直した方がいいよ
7 * n
770デフォルトの名無しさん:2005/04/27(水) 13:35:36
for(i=1; i<=n; x++)
 if(i%7==0)
  printf("%dは7の倍数です。\n",i);
 else
  printf("%dは7の倍数ではありません。\n",i);
771デフォルトの名無しさん:2005/04/27(水) 13:43:44
>>768
宿題なら宿題スレへ、そうでないならこちらへ。
http://pc8.2ch.net/test/read.cgi/tech/1108989422/
772デフォルトの名無しさん:2005/04/27(水) 14:08:23
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;
}
773デフォルトの名無しさん:2005/04/27(水) 14:11:47
>>769
貴様もな
774768: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;
}

ではだめですかねぇ?

775デフォルトの名無しさん:2005/04/27(水) 14:22:30
> for ( i=1; i<n; i=i+7)
776デフォルトの名無しさん:2005/04/27(水) 14:23:38
>>768
int f (int n) {if (n <= 0) return 0; else if (n%7) return f (n-1); else return n + f (n-1);}
777デフォルトの名無しさん:2005/04/27(水) 14:25:01
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;
}
778768:2005/04/27(水) 14:28:58
おーけー解決しますた
779デフォルトの名無しさん:2005/04/27(水) 14:44:24
>>776
int f(int n){return n <= 0 ? 0 : ((n % 7) ? 0 : n) + f(n - 1);}
780デフォルトの名無しさん:2005/04/27(水) 14:52:14
>>779
一緒じゃん。
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");
}

上のソースは問題ないでしょうか?ポインタ配列のアドレスが順番にとられる
ことは保障されているのでしょうか?
783デフォルトの名無しさん:2005/04/27(水) 15:10:16
>>782
問題なしだが *(ps2 + i) じゃなくて ps2[i] って書けよ。

>>781
死ね。
784デフォルトの名無しさん:2005/04/27(水) 15:13:14
>>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はテストです。この部分も動的です。
787デフォルトの名無しさん:2005/04/27(水) 15:17:16
>>785
可能です。
788デフォルトの名無しさん:2005/04/27(水) 15:17:17
可能です、********はコンパイラの制限内で幾らでも可能です。
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");
}
}

上記で途中で落ちるのですが、何が間違いでしょうか?
790デフォルトの名無しさん:2005/04/27(水) 15:23:24
×*ps2[i]
○(*ps2)[i]
791デフォルトの名無しさん:2005/04/27(水) 15:27:48
ありがとうございます。解決しましたが、
何が違うのかよくわかりませんでした。
792デフォルトの名無しさん:2005/04/27(水) 15:29:24
> 何が違うのかよくわかりませんでした。

苦労が報われなかった瞬間
793デフォルトの名無しさん:2005/04/27(水) 15:30:50
演算子の優先順位ぐらい覚えとけよ
794デフォルトの名無しさん:2005/04/27(水) 15:47:51
ありがとうございました。出直してきます。
795デフォルトの名無しさん:2005/04/27(水) 16:44:27
さーて、米でも研ぐか。
796デフォルトの名無しさん:2005/04/27(水) 16:58:53
今夜のおかずは何にしようかな。
お前ら何がいい?
797デフォルトの名無しさん:2005/04/27(水) 17:00:59
金クレ
798デフォルトの名無しさん:2005/04/27(水) 17:07:07
急速にスレの質が低下してまいりました
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で参照したいのです。
おかずはからあげがいいです。
800デフォルトの名無しさん:2005/04/27(水) 17:22:58
>>799
「aa[3][2]」と「ap[3][2]」とでは意味が異なる。
801デフォルトの名無しさん:2005/04/27(水) 17:23:35
> これは不可能でしょうか?mallocを使わずにapで参照したいのです。

不可能です。

> おかずはからあげがいいです。

不可能です。
802デフォルトの名無しさん:2005/04/27(水) 17:28:30
>>801
>> おかずはからあげがいいです。
>不可能です。

空age位出来るだろ!
803デフォルトの名無しさん:2005/04/27(水) 17:39:35
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] |
└───┴───┴───┴───┴───┴───┴───┴─   ─┴───┴───┘
804デフォルトの名無しさん:2005/04/27(水) 17:46:17
テキストファイルを一文字ずつ読み込んで、
カンマ(,)がくるとそれまでの内容を
変数に格納するコードを作りたいのですがよく分かりません。
教えてください。
805デフォルトの名無しさん:2005/04/27(水) 17:47:25
>>799
int (*ap)[5];
int aa[5][5];
ap = aa;
806デフォルトの名無しさん:2005/04/27(水) 17:49:30
>>804
具体的に何が分からないって?
807デフォルトの名無しさん:2005/04/27(水) 17:55:52
>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);
こんな感じだと思うんですが、的は外れてないでしょうか?
808デフォルトの名無しさん:2005/04/27(水) 17:59:41
>>807
妙に外れてる

char s[256] なのに s == ',' になるハズは無い
809デフォルトの名無しさん:2005/04/27(水) 18:00:38
っていうか、コンマが来たときに fclose されてない
810デフォルトの名無しさん:2005/04/27(水) 18:01:09
そもそも一文字づつ読んでない
811807:2005/04/27(水) 18:06:29
ワケワカメ。やっぱ出直してきます
812デフォルトの名無しさん:2005/04/27(水) 18:21:18
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);

何か仕様が違う気はするんだが
813デフォルトの名無しさん:2005/04/27(水) 18:24:10
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;
}
814807:2005/04/27(水) 18:48:35
>812
わざわざありがとうございます。fgetcなんて忘れてたorz
815デフォルトの名無しさん:2005/04/27(水) 18:49:26
>>814
813 にはお礼は無いのか
816デフォルトの名無しさん:2005/04/27(水) 19:00:23
>>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;
}
817デフォルトの名無しさん:2005/04/27(水) 19:09:10
TestConC.c(9) : warning C4013: 関数 'strlen' は定義されていません。int 型の値を返す外部関数と見なします。
818デフォルトの名無しさん:2005/04/27(水) 19:10:21
>>813を実行したら変な表示が出ました
どうしたらいいですか
819デフォルトの名無しさん:2005/04/27(水) 19:17:53
死ねばいいと思うよ。
820デフォルトの名無しさん:2005/04/27(水) 19:24:17
>>817
氏ね。string.hインクルードしとけ。
821デフォルトの名無しさん:2005/04/27(水) 19:30:03
strlenが文字列の長さを出力する関数だって想像できるだろ。
標準ライブラリに同じ名前の関数が定義されているんだから。
それに、ソースの全体をここに書いてやる必要がどこにある?
質問者がそれを見て理解できればそれでいいんだよ。
くだらん揚げ足とりは不愉快だから、消えてくれ。
822デフォルトの名無しさん:2005/04/27(水) 19:38:22
>>821
オマエモナー
823デフォルトの名無しさん:2005/04/27(水) 19:38:25
>>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]);
824デフォルトの名無しさん:2005/04/27(水) 19:41:55
急速にスレの質が低下してまいりました
825デフォルトの名無しさん:2005/04/27(水) 19:44:24
>>821
ミスっちゃったのがそんなに恥ずかしい? ププッ
826デフォルトの名無しさん:2005/04/27(水) 19:47:00
>>821
マジレスすると、コンパイルが通ってしまうので初心者が間違いに気付かない
可能性がある。(・A・)イクナイ
C++ みたいにエラーになってくれればまだ救いがあったけどね。
827デフォルトの名無しさん:2005/04/27(水) 19:56:36
間違い?
合法なCの使い方じゃん。
828デフォルトの名無しさん:2005/04/27(水) 20:08:13
合法だからまた害じゃないということは無いと思うが
829デフォルトの名無しさん:2005/04/27(水) 20:15:16
>>826
もともと、実際に動く物を作ってやる必要はないはずだが?
実際に動くものを作ってほしい奴はぼるじょあスレに行けばいい。
830デフォルトの名無しさん:2005/04/27(水) 21:32:04
もともと
#include <stdio.h>
#include <stdlib.h>
があるのに
#include <string.h>
がないよアハハーって話なのに、それが 「ぼるじょあスレに行け」 だって?
何というか、最近の若いもんはこうも無責任なもんなの?
831デフォルトの名無しさん:2005/04/27(水) 21:36:03
>>830
そうだ。トイレの落書きに責任なんかある訳ないだろ。氏ねよ。
832デフォルトの名無しさん:2005/04/27(水) 21:57:02
そういう態度取ってると質問者いなくなるよ
833デフォルトの名無しさん:2005/04/27(水) 22:00:58
細きゃあこと言っとらんで
はよ宿題スレに行きゃあて
834832:2005/04/27(水) 22:05:31
>>833
何で漏れが行かなきゃならん?
835デフォルトの名無しさん:2005/04/27(水) 22:20:24
心配せんでも、育て甲斐のある後進と、ただのゴミは区別している
論外なやつには露骨に嫌悪感を表に出す
それだけのことだ
836デフォルトの名無しさん:2005/04/27(水) 22:23:28
(・∀・)?
837デフォルトの名無しさん:2005/04/27(水) 22:43:35
コンマ演算子は処理系依存ですか?
838デフォルトの名無しさん:2005/04/27(水) 22:50:14
>>837
いいえ、規格にあります。
839デフォルトの名無しさん:2005/04/27(水) 22:51:28
規格にあっても asm は処理系依存だな
sizeof(int) とかも
840デフォルトの名無しさん:2005/04/27(水) 22:53:52
asm は処理系依存だな
asm は処理系依存だな
asm は処理系依存だな
asm は処理系依存だな
asm は処理系依存だな
asm は処理系依存だな
asm は処理系依存だな
841デフォルトの名無しさん:2005/04/27(水) 22:54:55
しかしコンマ演算子は処理系依存ではない。
842デフォルトの名無しさん:2005/04/27(水) 22:58:49
>sizeof(int) とかも
は信じていいですか? 初めて聞いたんですけど
843デフォルトの名無しさん:2005/04/27(水) 23:02:55
sizeof(int) の結果は処理系依存。
sizeof(char) の結果は必ず 1。
844デフォルトの名無しさん:2005/04/27(水) 23:03:13
intが16bitだったり32bitだったりするって話だろーよ
845デフォルトの名無しさん:2005/04/27(水) 23:03:41
>>842
規格には-32767〜32767の値を表現できなければならないと書かれているだけ。
846デフォルトの名無しさん:2005/04/27(水) 23:04:20
あぁ、そういう意味でしたか。
sizeof 演算子自体が処理系によってないのかとおもたです。
レスありがとうございました。
847デフォルトの名無しさん:2005/04/27(水) 23:07:34
>>840
文句あるなら聞こうか小僧
848デフォルトの名無しさん:2005/04/27(水) 23:12:54
>>847
asmはC++のキーワード
Cではなんの意味も無く、識別子としても予約すらされていない。
849デフォルトの名無しさん:2005/04/27(水) 23:21:53
isascii が処理系にない場合、どのように作ればいいのでしょうか?
850デフォルトの名無しさん:2005/04/27(水) 23:25:24
int isascii(int c)
{ return 0x00 <= (unsigned char)c && (unsigned char)c <= 0x7F; }
851デフォルトの名無しさん:2005/04/27(水) 23:26:40
852デフォルトの名無しさん:2005/04/27(水) 23:30:47
cが256以上だと
853デフォルトの名無しさん:2005/04/27(水) 23:36:22
int isascii(int c)
{ return isupper(c) || islower(c); }
854853:2005/04/27(水) 23:37:04
orz
855デフォルトの名無しさん:2005/04/27(水) 23:38:41
int isascii(int c)
{return c&0x7f;}
856デフォルトの名無しさん:2005/04/27(水) 23:41:35
>>855
0x00yは?
857デフォルトの名無しさん:2005/04/27(水) 23:42:18
訂正:0x00は?
858デフォルトの名無しさん:2005/04/27(水) 23:45:34
というより isascii って標準じゃないの?
859デフォルトの名無しさん:2005/04/27(水) 23:47:33
>>858
標準関数が使えない環境なんざザラ
860デフォルトの名無しさん:2005/04/27(水) 23:50:43
>>858
isascii() は非標準
iswascii() は標準

>>859
標準関数が使える環境が前提のスレじゃなかったか?
861デフォルトの名無しさん:2005/04/27(水) 23:51:02
int isascii(int c)
{
#ifdef isascii
    return isascii(c);
#else
    return !(c & (~0x7F)); /* 標準でない場合 */
#endif
}
862デフォルトの名無しさん:2005/04/27(水) 23:54:20
無限再帰?
863デフォルトの名無しさん:2005/04/27(水) 23:59:56
#ifndef isascii
int isascii(int c) {...}
#endif
864デフォルトの名無しさん:2005/04/28(木) 00:10:49
>>823
勉強になりますた。
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])だけでメモリはきちんと解放されるのでしょうか?
867デフォルトの名無しさん:2005/04/28(木) 11:49:30 BE:40761937-#
>>832
質問者がいなくなるのはとてもいいことだと思いますが。何か問題でも?
868デフォルトの名無しさん:2005/04/28(木) 11:51:24
>>866
されない。
869デフォルトの名無しさん
すみませんが、解放の方法を教えてください。