5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

C言語なら、俺に聞け! <17>

1 :金融プログラマー日下部陽一:02/04/21 15:55
漏れは38才、21年間プログラムを一生懸命作ってきた。
いろいろな言語を極めたが、一番手になじむのはCだった。
Cのことならぜんてわかるから、疑問な点があったら漏れに聞け。

だが、いちいちFAQに載った質問に応えるほど暇じゃない。
課題丸投げなら別スレにいけ。

・comp.lang.c Frequently Asked Questions
http://www.eskimo.com/~scs/C-faq/top.html

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html

Cプログラマならこれを買っとけ。
・プログラミング言語C(K&Rと呼べば通だ)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/yfcbookshelf-22/250-3950205-1475419

K&Rで挫折するような救いがたいやつはこれでも読め
・作ってわかるCプログラミング(アヒル本と呼べば通だ)
http://dennou.gihyo.co.jp/books/void_c/
http://www.amazon.co.jp/exec/obidos/ASIN/477411328X/249-4698746-2014711

推薦図書/必読書のためのスレッド PART3
http://pc.2ch.net/test/read.cgi/tech/1016722820/

・前スレ C言語なら、俺に聞け! <16>
http://pc.2ch.net/test/read.cgi/tech/1018453690/


2 :デフォルトの名無しさん:02/04/21 16:02


3 :デフォルトの名無しさん:02/04/21 16:03
C言語ってナニ?

4 :デフォルトの名無しさん:02/04/21 16:05
いつまでアヒル本の宣伝すれば気がすむんじゃー

5 :デフォルトの名無しさん:02/04/21 16:07
>>3
UNIX記述専用言語

6 :デフォルトの名無しさん:02/04/21 16:11
>>3
A、B、とくりゃ、次はC。

7 :デフォルトの名無しさん:02/04/21 16:12
>>3
C++言語の前身。

8 :デフォルトの名無しさん:02/04/21 16:13
>>6
正解。

9 :デフォルトの名無しさん:02/04/21 16:17
Aって何?B=BASICだけど・・・

10 :デフォルトの名無しさん:02/04/21 16:18
Ada

11 :デフォルトの名無しさん:02/04/21 16:19
AHIRU

12 :デフォルトの名無しさん:02/04/21 16:24
APL

13 :デフォルトの名無しさん:02/04/21 16:25
Kiss

14 :デフォルトの名無しさん:02/04/21 16:26
いや、みんな待て。
俺には>>9が本気に見えて仕方がない。
ぼけるより>>9を糾弾した方が良くないか?

15 :デフォルトの名無しさん:02/04/21 16:29
たしかに(藁

16 :Borland:02/04/21 16:35
A=Assembler

良心的に解釈すれば>>9はCPLの部分を省略したんだと思う。。

17 :Ken Thompson:02/04/21 16:36
オレの存在っていったい・・・

18 :Ken Thompson:02/04/21 16:40
やた!オレのことちゃんと載ってるじゃーん。
http://www2.gihyo.co.jp/books/pdf/4-7741-1142-2.pdf

19 :デフォルトの名無しさん:02/04/21 16:44
elseif が無いって本当ですか?

20 :デフォルトの名無しさん:02/04/21 17:06
>>19
本当です。かわりにelse_if(_はスペース)をつかってください。
トリッキーな使い方するとハマるかもしれんけど。

21 :デフォルトの名無しさん:02/04/21 17:11
>>16
ん?BはBCPLじゃなくてB言語のBでしょ?
BCPL -> B -> C ってなかんじで。

22 :16:02/04/21 17:28
>>21
まちがえた。フォローサンクス。確認したらそうなってた。
確認ついでに知ったんだけど、ThompsonってUNIXの高級言語書きに
Bでトライする前にFortranでもトライしてたのね。

23 :デフォルトの名無しさん:02/04/21 18:39
C言語の勉強はじめました。
K&Rの演習1-9でつまづきました。

#include <stdio.h>

int main(void)
{
int c;
int flag = 0;

while((c = getchar()) != EOF){
if(c == ' '){
if(flag)
putchar(c);
}
else{
putchar(c);
flag = 0;
}
}

return 0;
}

一応できたっぽんですが、なんか泥臭いような気がします。
もっとスーマトな方法ってありますか?

24 :デフォルトの名無しさん:02/04/21 18:57
出来てないだろ、フラグはどこでセットしてる?

25 :デフォルトの名無しさん:02/04/21 18:57
>>23
正しく動かないぞこれ。

26 :デフォルトの名無しさん:02/04/21 19:06
>>23
#include <stdio.h>

int main()
{
 int ch = getchar();
 while (ch != EOF) {
  putchar(ch);
  if (ch == ' ')
   while ((ch = getchar()) == ' ');
  else
   ch = getchar();
 }
}


27 :23:02/04/21 19:07
すいません。
確かに正しく動きませんでした。

#include <stdio.h>

int main(void)
{
int c;
int flag = 0;

while((c = getchar()) != EOF){
if(c == ' '){
if(!flag){
putchar(c);
flag = 1;
}
}
else{
putchar(c);
flag = 0;
}
}

return 0;
}

やっぱりなんかスマートじゃないような。。。

28 :デフォルトの名無しさん:02/04/21 19:16
いいかげん>>1のテンプレは変えてほしい。
意味もなく長いのは目障り。

29 :デフォルトの名無しさん:02/04/21 19:17
題意がわからんけど空白っていわゆるWhiteSpaceを指しているような気も。
連続するWhiteSpaceを一個の' '(0x20)に押しつぶすプログラム、が
問題であるとして、その回答例をあげとく。

#include <stdio.h>
#include <ctype.h>

#define SREP ' '

int main()
{
    int c, prev = 0;

    while ((c = getchar()) != EOF)&
nbsp;{
        if (!isspace(c))
            putchar(
prev = c);
        else if (!isspace(prev
))
            putchar(
prev = SREP);
    }
    return 0;
}


30 :29 :02/04/21 19:19
いかんぐちゃぐちゃになってる....
むしして


31 :デフォルトの名無しさん:02/04/21 19:21
>>28
演習1-8が 空白、タブ、改行を〜
演習1-9が 2つ以上の空白を〜
となっているから、空白はスペースのみかと。

32 :デフォルトの名無しさん:02/04/21 19:32
#include <stdio.h>

int main()
{
int c;
int prev = 0;

while ((c = getchar()) != EOF)
{
if (!(c == ' ' && prev == ' '))
putchar(c);
prev = c;
}
return 0;
}

こーゆーこと?
K&R三冊買ったけど全部誰かにあげちまったからなあ..


33 :23:02/04/21 19:37
おお!みなさんすごいありがとうございます。

>>23
なんかflagとか使ってるのはずかしくなりました。。。

34 :デフォルトの名無しさん:02/04/21 19:41
>>26
>>23
#include <stdio.h>

int main()
{
 int ch = getchar();
 while (ch != EOF) {
  putchar(ch);
  while ((ch = getchar()) == ' ');
 }
}

後半のifは冗長だな、これだけでよかった。

35 :23:02/04/21 19:44
>>34
すごいスマートでかっこいいですね。
早くそういう風にかけるように、がんがん勉強していきます。

36 :デフォルトの名無しさん:02/04/21 20:05
#include <stdio.h>

int main()
{
 int ch = 1;//!EOF
 while ((ch = getchar()) != EOF) {
  if(ch != ' ')
    putchar(ch);
 }
}


37 :デフォルトの名無しさん:02/04/21 20:10
>>36
問題読んだ?
スペースが出力されないよ

38 :デフォルトの名無しさん:02/04/21 20:12
>>34
それも正解のうちの一つなんだけど、
二カ所でgetchar()してるのはキモイ。

getchar()
while()
{
/* なんか処理 */
getchar();
}

はCOBOLER臭くてキモイ。

でもたしかに、それも正解。


39 :デフォルトの名無しさん:02/04/21 20:20
>>38
じゃああなたならどうかく?

40 :26=34:02/04/21 20:38
>>38
キモイキモイってそこまで言わなくてもいいじゃんかよ ヽ(`Д´)ノ ウワァァン

スマートに書くっていうはなしだから、状態変数用意したり
直前の文字を記憶しておくやり方が泥臭いと思ってああいう風に書いたんだよ。

41 :デフォルトの名無しさん:02/04/21 20:42
#include <stdio.h>

int main()
{
  int nSpaceCount = 0;
  int nChar;
  while ((nChar = getchar()) != EOF)
  {
    nSpaceFlag = (nChar == ' ') ? ++nSpaceCount : 0;
    if (nSpaceCount <= 1) putchar(nChar);
  }
  return 0;
}

42 :41:02/04/21 20:42
nSpaceFlag -> nSpaceCount

43 :デフォルトの名無しさん:02/04/21 20:47
if (>>38 == >>41) {
 printf("別に取り立ててスマートには見えない\n");
}
else {
 printf("nSpaceCountがオーバーフローしたらどうするよ?\n");
}

44 :名無しさん@edlin:02/04/21 20:57
>>41
++nSpaceCount -> nSpaceCount++
なら、ちょっとトリッキーでCoolかも。

45 :38:02/04/21 21:01
>>40
おれの>>32
直前の文字を持ってるから、キモイと思う人から見ればキモイんだろう。

状態変数はぱっと見でわかりずらいから
>>32>>34のどっちかになるんだろうね。


46 :デフォルトの名無しさん:02/04/21 21:06
strtokを使ってはいけないと聞きました。
確か、staticな変数を使ってるかなんか・・・。

で、それに変わる関数はあるのでしょうか?

47 :デフォルトの名無しさん:02/04/21 21:11
みんなstdioって何て呼んでる。
漏れ、呼んではいないが”すたんだーどあいおー”と
心の中で決めてる。
stdlibやstdringについても詳細キボンヌ。


48 :デフォルトの名無しさん:02/04/21 21:15
>>47
「False」を「ファール」って発音してる人の数→
http://pc.2ch.net/test/read.cgi/tech/1005578173/

49 :デフォルトの名無しさん:02/04/21 21:15
stdio えすてぃーでぃーあいおー
stdlib えすてぃーでぃーりぶ
stdring 何これ?

50 :デフォルトの名無しさん:02/04/21 21:15
>>46
lex 使うか自分で作る。

51 :デフォルトの名無しさん:02/04/21 21:18
えすてぃーでぃーあいおー
えすてぃーでぃーりぶ
その次の奴は何?はじめてみた。

個人的に、libibertry.oっていうファイル名が好き。
IDEな人にはわからないかもだけど。

52 :47:02/04/21 21:18
stdring→stringでした。
逝ってきまそ。
で、なんて呼んでまふ。

53 :デフォルトの名無しさん:02/04/21 21:19
すとりんぐ

54 :デフォルトの名無しさん:02/04/21 21:20
すとりんぐ。ってそのままだね。他の読み方知りたい。

55 :デフォルトの名無しさん:02/04/21 21:20
>で、なんて呼んでまふ。

ワラタ

56 :デフォルトの名無しさん:02/04/21 21:21
>>46
問題ない。使いなさい。

57 :デフォルトの名無しさん:02/04/21 21:21
ガムバッテミルコトニシマス。
ドモアリガトウゴザイマシタ

58 :デフォルトの名無しさん:02/04/21 21:22
>>52
他に呼び方あったら逆に知りたいぞ

59 :デフォルトの名無しさん:02/04/21 21:41
>>58
すとあいんぐ

60 :デフォルトの名無しさん:02/04/21 21:59
stdio すたんだーどあいおー
stdlib すたんだーどりぶ or すたんだーどらいぶらり
string ひも

>>46
スレッドセーフでないってだけじゃなかった?
使いづらいから使ったことないけど。

61 : :02/04/21 22:06
strtokは絶対使用しない事と書いてありますが、そんなに危険なんでしょうか。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strtok.3.html

62 :デフォルトの名無しさん:02/04/21 22:07
>46
strtok_r()って関数が用意されてないかえ?
処理系によるけど。

63 :デフォルトの名無しさん:02/04/21 22:16
>>61
問題ありません。使ってください。

64 :46:02/04/21 22:18
処理系はVC
タブ区切りのテキストファイルの数値を変数に。

スレッドセーフでないと言うのは、
マルチスレッドの時に困るだけでしょうか?

65 :デフォルトの名無しさん:02/04/21 22:20
>>64
そのとーり。
でも、タブ区切りの数値を抽出するなら、sscanf()でOK。

66 : :02/04/21 22:20
strtokは152\t\t\t46\t64というような感じでタブ間に何もないレコードがある時は
まともに動くんでしょうか?うまく動かなかったような気がするのですが。

67 :デフォルトの名無しさん:02/04/21 22:22
>>64
VCだったらマルチスレッドライブラリを使用すれば、
strtokもスレッドセーフになる

68 :46:02/04/21 22:49
どうもレスありがとうございます。

sscanf早速使ってみることにします。

69 :デフォルトの名無しさん:02/04/21 23:02
BSD4.4で導入されたstrsepという関数は
1)連続するデリミタもそれぞれデリミタとして扱う
2)リエントラントである
3)最初の呼び出し・2度目以降の呼び出しで呼び出し方を変更する必要が無く
利用者のコードがstrtokよりシンプルになる
点がstrtokよりもマシ。
LinuxやBSD系列のOSで使えるはず。

man: http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strsep.3.html
実装: http://nemesis.sourceforge.net/browse/mod/venimpl/c/str/strsep.c.html

# 勿論通常はシステムで用意されていないので
# 実装を自分で用意する必要が有る
# VC++では_tcspbrkが使えるので、strsepを簡単にマルチバイト対応にできる。


70 :デフォルトの名無しさん:02/04/21 23:03
>>66
そうだね。元々、strtok() って、コンパイラなんかの字句解析用だから、
先行するデリミタは全て読み飛ばすよ。そもそも、CSV の読込に、
strtok() なんか使う方が変。

71 :新規質問:02/04/21 23:11
  char *string;
と宣言して、
  scanf("%s",string);
で、代入しました。
この文字列 string を、ある文字列と比較する場合、
どのように書けばイイでしょうか?
  if (string=="abcdefg"){
    ………
  }
ではだめなようです。
また、比較対象文字列が空白文字列、つまり、
string が空文字列かどうか調べるのはどうすればイイでしょうか?


72 :デフォルトの名無しさん:02/04/21 23:12
if(strcmp(string,"abcdefg"))

if(string[0]=='\0')

73 :72:02/04/21 23:13
やべ。
if(strcmp(string,"abcdefg")==0)
だった。

74 :デフォルトの名無しさん:02/04/21 23:13
>>71
ネタですよね。ネタといって下さい。お願いします。
strcmp

75 :デフォルトの名無しさん:02/04/21 23:15
>>74
ネタでしょ。strcmp知らない奴がmallocを知っているとも思えないし(mallocでも使わないと落ちるから)。

76 :& ◆cyWCSrs. :02/04/21 23:15
>>74
マジでしたが、>>74を見てからはネタになりました。(w
さっきまで文字列比較関数のない言語やってたもんだから、つい・…

>>72-74
罵倒せずに答えてくれてどうもありがとう。

77 :デフォルトの名無しさん:02/04/21 23:16
comp以前に・・・

78 :デフォルトの名無しさん:02/04/21 23:17
単方向リスト構造のデータを簡単にソート
できる方法ない?実際に並び替えなくても
表示させるだけでもいいんだけど。

79 :デフォルトの名無しさん:02/04/21 23:18
>>72-74
おい、その前に...
>   char *string;
> と宣言して、
>   scanf("%s",string);
> で、代入しました。
には、誰も突っ込まんのか ?

80 :デフォルトの名無しさん:02/04/21 23:19
>>79
>>75



81 :デフォルトの名無しさん:02/04/21 23:22
>>79
char *stringが関数の仮引数だったらOK

82 :デフォルトの名無しさん:02/04/21 23:23
>>78
そもそも、ソートするなら何故に単方向リスト使うのよ。

83 :デフォルトの名無しさん:02/04/21 23:25
>>82
ノリで。

84 :デフォルトの名無しさん:02/04/21 23:25
>>81 stack overflowの危険性が

85 :デフォルトの名無しさん:02/04/21 23:26
>>78
別に配列作って全部コピーしてからqsort

86 :デフォルトの名無しさん:02/04/21 23:27
>>85
やっぱりそれしかないか・・・。
サンクス!

87 :79:02/04/21 23:28
>>80
ごめんよ、かぶっちまったよ。

>>81
ふーん、今時 K&R スタイルかよ。

88 :デフォルトの名無しさん:02/04/21 23:29
>>83
そういうときは、インデックスを用意して、そっちをソートする。
あ〜〜〜なんて言ったらいいんだろう。

89 :デフォルトの名無しさん:02/04/21 23:30
>>88
ポインタだけ配列にコピーしてqsortってことかな?

90 :デフォルトの名無しさん:02/04/21 23:31
>>87
K&Rスタイルって何?
var[]ではなく*varと書くということ?

マジ質

91 :デフォルトの名無しさん:02/04/21 23:33
正直mallocって理解があやふやだ

92 :88:02/04/21 23:35
>>89
そそ、そんなかんじ。
で、大小比較する関数で、その配列に入ってるポインタの先にある
もの(構造体?)を比較してあげればいいと思う。

93 :82:02/04/21 23:35
>>83
ノリかよ !!

>>84
何故に Stack ? 関数に渡されるのは malloc() の返り値かも知れんし、
static char a[1000]; とした a かも知れんよ。
まあ、scanf("%s", ...) なんて使うこと自体がまずいと思うが...。

94 :デフォルトの名無しさん:02/04/21 23:36
>91
C言語入門本の中に、例題としてmalloc()の実装やってるのが
あったような気がする、何冊か。

95 :デフォルトの名無しさん:02/04/21 23:36
>>90
int main(argc,argv)
int argc;
char *argv[];
{
}
てやつでしょ。

96 :デフォルトの名無しさん:02/04/21 23:37
???理解できん

97 :デフォルトの名無しさん:02/04/21 23:38
>>88
>>89
なんとなく分かりかけてきたYO.


98 :91:02/04/21 23:38
>>94
俺の持ってる入門書には全然書いてないんだわ。
参るぜ…まったく

99 :79:02/04/21 23:38
>>90
ちゃう。

ANSIスタイル
void foo(char *string){}

K&Rスタイル
void foo(string)
char *string;
{
}

ANSI だったら、宣言の最後に ';' はつかん。

100 :95:02/04/21 23:39
ありゃ、違ったっけ?
最近すっかりANSIスタイルで書くようになっちゃったので・・・
間違ってたら訂正キボン。

101 :デフォルトの名無しさん:02/04/21 23:39
上の argc,argv が仮引数。
その下の
int argc;
char *argv[];
が引数。

数も順番もあってなくてOKのあやふやな引数の宣言だった。


102 :デフォルトの名無しさん:02/04/21 23:39
>>99
そういえばセミコロンがついていたか。見落とした。スマソ
ちなみに俺はそんなスタイルは使っていないよ。

103 :102:02/04/21 23:41
RubyのソースコードがK&Rスタイルだったような・・・・
だめじゃんまつもと!

104 :デフォルトの名無しさん:02/04/21 23:41
>>87
それ以前に、なんで81がK&Rになるんだヨ

105 :デフォルトの名無しさん:02/04/21 23:42
そのK&RはANcIでも使えるんでしょ?
確か。

106 :デフォルトの名無しさん:02/04/21 23:44
>>105
うん。

107 :105:02/04/21 23:44
>>106
ども!

108 :デフォルトの名無しさん:02/04/21 23:45
>>107
でも使うなよ

109 :デフォルトの名無しさん:02/04/21 23:47
通はトリグラフ。これ最強。
C++でも使える。

110 :105:02/04/21 23:47
>>108
うん。ANCIでやってます。
だってコードが長くなるもん♪

111 :ヽ(`Д´)ノ:02/04/21 23:48
つまり…??

112 :79:02/04/21 23:48
>>102
まあ、ちょっとした嫌味だ。気にするな。第一、今時のコンパイラは ANSI
がディフォルトだから、K&R スタイルでやると警告がでるぞ...と、やって
みたら VC++ 6 だと、警告レベル 4 にしてもなんも言わん...。さすが
MS だよ、まったく。まあ、プロトタイプ宣言とかできんから、強いて覚
える必要はないよ。

113 :デフォルトの名無しさん:02/04/21 23:49
>>103
ANSI C 対応コンパイラが標準で入ってないマシンでも動かせるように K&R スタイルにしてるらしい。
確かに SunOS4.1 あたりの Sun cc は ANSI-C 未対応だ。
いいかげん ANSI C スタイルに変えるとは言っているが…

114 :デフォルトの名無しさん:02/04/21 23:52
トライグラフ?

115 :デフォルトの名無しさん:02/04/21 23:53
>>113
なるほど。
ということはプロトタイプ宣言もしていないのかな?

116 :115:02/04/21 23:54
>>112にできないと書いてあるじゃん。すまなかった。

117 :デフォルトの名無しさん:02/04/21 23:56
HPのおまけコンパイラもかなりやる気のない対応具合だ。


118 :デフォルトの名無しさん:02/04/21 23:56
>>113
普通そう言うときは、ANSI → K&R 変換ツールとか使わんかなぁ...。プロト
タイプ宣言はどうしてんの ? 使ってねぇのか ?

119 :デフォルトの名無しさん:02/04/21 23:58
>>112
ANSIで消極的とはいえ認められているのだから、K&Rスタイルも立派なANSI準拠だと思うが。
だから、警告は出ないのは当然だし出すべきではないと思うが。

>>114
トライっていうの?
化学ではトリ〜が慣例だからそう読んでた。

120 :デフォルトの名無しさん:02/04/22 00:08
>>115
外部公開する API 以外はしてないね。

121 :79:02/04/22 00:32
>>119
互換性のためだろ ? 良くないスタイルなんだから、警告ぐらい出しても
いいと思うぞ。VC++ 6 のヘルプには...
-------------------------------
コンパイラの警告 (レベル 4) C4131
'function' : 旧形式の宣言が使われています。
関数宣言がプロトタイプ形式ではありません。
旧形式の関数宣言をプロトタイプ形式に変換してください。
次のコードは、旧形式の宣言です。
int addrec( name, id )
char *name;
int id;
{ }
これを、新形式のプロトタイプ形式に変換すると、次のようになります。
int addrec( char *name, int id )
{ }
-------------------------------
つーのが、あるのにねぇ...。
ちなみに...
-------------------------------
コンパイラの警告 (レベル 4) C4130
'operator' : 文字列定数のアドレスで論理演算が行われました。
リテラル文字列のアドレスに演算子が使われ、不要なコードが生成されま
した。
次にこの警告の例を示します。
char *pc;
pc = "Hello";
if (pc == "Hello")
{ }
上の if ステートメントは、ポインタ pc に格納された値と、コード内に
現れるたびに割り当てられる文字列 Hello のアドレスを比較しています。
この if ステートメントは、pc が指す文字列と、文字列 Hello は比較し
ません。
文字列を比較するには strcmp 関数を使ってください。
-------------------------------
なんてのもあって、今回のそのままじゃんって感じ。でも、この警告出せ
ないんだけど...。

また、(ANSI 準拠だから)「警告は出ないのは当然だし出すべきではない」
と言うのには、賛成できねぇ。ANSI に準拠していたって、制御が渡らない
コードや、未使用のローカル変数とか指摘するコンパイラって珍しくない
し、そう言う機能もいらないと言うのか ? (だすださないを制御できる必
要はあるだろうけど...。)

122 :デフォルトの名無しさん:02/04/22 00:34
( ´∀`) 必死に調べたんだねぇ。えらいえらい。

123 :デフォルトの名無しさん:02/04/22 00:35
反論したくてしょうがなかったんだろうな。

124 :114:02/04/22 01:07
>>119
いちおう、トライっぽい。
http://eiwa.excite.co.jp/view.jsp?block=43835&offset=698&id=NEW_EJJE

125 :日下部圭子:02/04/22 09:38
age

126 :デフォルトの名無しさん:02/04/22 16:36
最近Cを勉強しているのですが
下記の関数の作りかたがわかりません。
どなたかアドバイスを宜しくお願い致します。
typedef struct{
char c1[2];
char c2[3];
}HEADER;
typedef struct{
HEADER head;
char c3[4];
char c4[5];
}BODY1;
typedef struct{
HEADER head;
char c5[6];
char c6[7];
}BODY2;
という構造体があって
int func(void *vp);
という関数にBODY1か2の型のポインタがvoid型の引数できます。
func()の中で構造体の各メンバを参照するのとheadをぬかした
サイズを取ってreturnするにはどうすればいいでしょうか?
それともこの場合引数にvoid型を使うのは間違いでしょうか?
アドバイスを宜しくお願い致します。

127 :デフォルトの名無しさん:02/04/22 16:44
不可能です。
間違いです。

winのBITMAPINFO構造体などを参考に、
構造体のサイズをメンバに持たせる手もありますが、
おすすめしません。

128 :デフォルトの名無しさん:02/04/22 16:45
>>126
union使えや

struct Item {
 int type;
 union {
  char a;
  int b;
  long c;
 } Body;
};

void func(Item* item)
{
 switch(item->type) {
 case 0: printf("%c\n", item.Body.a);
 case 1: printf("%d\n", item.Body.b);
 case 2: printf("%ld\n", item.Body.c);
 }
}


129 :デフォルトの名無しさん:02/04/22 16:52
>>126
offsetofマクロを使ったらトリッキーなプログラムが書けるかも知れない。

130 :デフォルトの名無しさん:02/04/22 16:57
問題です。
128の間違いはなんでしょう?

131 :デフォルトの名無しさん:02/04/22 17:01
>>130
x item.Body.a
o item->Body.a

132 :デフォルトの名無しさん:02/04/22 17:01
sleep関数みたいな奴C言語でありませんか?

133 :126:02/04/22 17:02
お返事ありがとうございます。
実はこれ課題で出されたものなんです。
構造体のみで共用体は使えません。
引数のvoid型は自分で勝手に考えたのですがおもいきり間違いみたいです。
どうにかして上記のような機能をもつ関数を作りたいのですが
いい方法は無いのでしょうか?
それとも不可能なのでしょうか?

134 :デフォルトの名無しさん:02/04/22 17:03
>>130
item.Body ではなく item->Body
breakがない
引数にconstがない

135 :デフォルトの名無しさん:02/04/22 17:05
>>133
外出だけどoffsetofとキャストを使った汚い方法しかないんじゃないの?

136 :デフォルトの名無しさん:02/04/22 17:10
>>133
void *でもint *でもいいです。どうせキャストして使うんですから。

137 :デフォルトの名無しさん:02/04/22 17:16
>>133
役に立たない教官ですね。
畳んでおしまいなさい。

138 :デフォルトの名無しさん:02/04/22 17:19
>>132
プラットフォーム依存。
Unixならsleep()やusleep()、Win32ならSleep()

139 :デフォルトの名無しさん:02/04/22 17:25
printfで最小幅を設定したときの充てん文字(スペース)を変更する方法は何かないでしょうか?
それ以前にこの文章の意味を理解してもらえるか心配です


140 :126:02/04/22 17:27
すみません。説明がたりませんでした。
HEADERのc1の値が1なBODY1,2ならBODY2でした。
でも関数の引数は構造体の先頭ポインタ1個だけです。
なにかいい方法はないでしょうか?


141 :デフォルトの名無しさん:02/04/22 17:31
>>140
構造体のタイプがわかるなら、
void*じゃなくてHEADER*で受け取って、タイプを判別した後に
望みの形にキャスト

142 :デフォルトの名無しさん:02/04/22 17:41
>>139
ゼロパディングなら%04dってな感じで(45なら0045と表示される)。
他の文字は知らない。

143 :デフォルトの名無しさん:02/04/22 17:43
>>140
こんなもんかな。皆様訂正キボンヌ。

int func(void *p);

int main(void)
{
BODY1 b1;
BODY2 b2;

b1.head.c1 = 1;
b1.c3[0] = 1;
printf("size of b1 inner = %d\n", func(&b1));

b2.head.c1 = 2;
b2.c5[0] = 2;
printf("size of b2 inner = %d\n", func(&b2));

getchar();

return 0;
}

int func(void *p)
{
switch (((HEADER *)p)->c1) {
case 1:
printf("c3[0] = %d\n", ((BODY1 *)p)->c3[0]);
return sizeof *(BODY1 *)p - offsetof(BODY1, c3[0]);
case 2:
printf("c5[0] = %d\n", ((BODY2 *)p)->c5[0]);
return sizeof *(BODY2 *)p - offsetof(BODY2, c5[0]);
default:
return 0;
}
}

144 :デフォルトの名無しさん:02/04/22 17:45
>>143
おっとっと。getchar()は取って下さい。

145 :質問:02/04/22 18:00
WindowsXPのソースが全く解からないんですけど
せめてカーネル部分を教えてくれませんか?

146 :デフォルトの名無しさん:02/04/22 18:01
あんたMSの社員?

147 :デフォルトの名無しさん:02/04/22 18:02
>>145
誤爆?

148 :デフォルトの名無しさん:02/04/22 18:16
えっと、プログレスバーをMFCを使わずにWinで表示したいのですが、
hwndProgressCtrl = CreateWindowEx(0,PROGRESS_CLASS,"",
WS_VISIBLE | WS_CHILD | PBS_VERTICAL | PBS_SMOOTH,
10, 50, 20, 80, hDlg, (HMENU)IDC_PROGRESSBAR, g_hInstance, NULL);
こんな感じで書いたのですがエラーが出てしまいます。
エラー内容はPROGRESS_CLASSが定義されていないとか、そんなのばっかりです。
どうすれば直りますか?


149 :デフォルトの名無しさん:02/04/22 18:20
定義すればいいし、それはCじゃなくてWinの話だし・・・

150 :デフォルトの名無しさん:02/04/22 18:24
func(BYTE data1,BYTE data2){
DWORD val=(data2<<8) | data1;
return val;
}
なんでこれは上手く行くのでしょうか?
(data2<<8)は0だと思うのですが

151 :デフォルトの名無しさん:02/04/22 18:27
'8'がintだから、型がagaるのでわ?

152 :デフォルトの名無しさん:02/04/22 18:28
それいぜんに、シフト時の結果は処理系依存

153 :デフォルトの名無しさん:02/04/22 19:10
sizeof (data2<<8) の値を確認してみては?

154 :デフォルトの名無しさん:02/04/22 19:44
実際試してみれば?

155 :デフォルトの名無しさん:02/04/22 20:58
試したら上手くいったの
だから、なぜ???

156 :デフォルトの名無しさん:02/04/22 22:50
intより小さい型は演算するときintに格上げされます。

157 :デフォルトの名無しさん:02/04/23 00:31
式値
式値の型
格上げ
暗黙の型変換

あたりを調べよう。
載ってない「入門本」は捨てていいよ。
の無駄だったね。


158 :デフォルトの名無しさん:02/04/23 01:39
の無駄だったね。

159 :デフォルトの名無しさん:02/04/23 06:57
の無駄だったね。

160 :デフォルトの名無しさん:02/04/23 08:10
の無駄だったね。

161 :日下部圭子:02/04/23 08:51
あへ

162 :いっちゃん:02/04/23 15:40
+,-の演算子を使わないで加減演算を行なうにはどうしたらよいですか?

163 :デフォルトの名無しさん:02/04/23 15:42
>>162
++は?

164 :162:02/04/23 15:49
++,--は使わないです。できますか?

165 :デフォルトの名無しさん:02/04/23 15:51
加算器をシミュレートすりゃ可能だが…

166 :デフォルトの名無しさん:02/04/23 15:54
>>165
full adderでも使いますか。

167 :デフォルトの名無しさん:02/04/23 16:24
>>162
アセンブラのコードを埋め込む、とかな。
…って、C じゃないじゃん>漏れ

あと、圧倒的にでっかいテーブルを(略)

168 :デフォルトの名無しさん:02/04/23 17:15
日下部陽一?
喰いもの関連のニュースグループでうっとーしい奴か?


169 :デフォルトの名無しさん:02/04/23 17:20
<162
ほれ宿題取り(あえず2桁ぐらい確認)

unsigned long adder( unsigned short _a, unsigned short _b )
{
int i;
unsigned long a = _a;
unsigned long b = _b;
unsigned long ha;
for ( i = 0; i < sizeof ( unsigned short ) * 8; i ++ ) {
ha = (~a & b) | (a & ~b);//inv exor(half adder)
b = ( a & b ) << 1;//carry
a = ha;
}
return a;
}

170 :162:02/04/23 17:57
>169様
ありがとうございます。参考にさせていただきます。
皆様、ありがとうございました。

171 :デフォルトの名無しさん:02/04/23 18:32
UINT add(UINT a, UINT b){
  if (a != 0 && b != 0)
    return add(a ^ b, (a & b) << 1);
  else
    return a | b;
}
試しにやってみた。
これ合ってる?

172 :デフォルトの名無しさん:02/04/23 19:39
sprintfがバグります。
同じソースをUNIXのgccでコンパイル→UNIXで実行すると動くのに、
Borland C++でコンパイル→WIN98で実行すると
その後の入力が全部壊れてしまいます。
これってプログラムが間違ってるってことでしょうか?


173 :デフォルトの名無しさん:02/04/23 19:40
>>172
ソースは?

174 :デフォルトの名無しさん:02/04/23 19:41
>>172
ほとんどの場合、そのプログラムが悪い。
特にsprintfなんて枯れた部分ならなおさら。

175 :  :02/04/23 19:56
main()

こっから何書いてイイのかわかりません

176 :172:02/04/23 19:56
>>173
こんなのです。

#include <stdio.h>
void main()
{
char a[4],b[4];
int i=1234;
int j=5678;

sprintf(a,"%4d",i);
sprintf(b,"%4d",j);

printf("a = %s\n",a);
printf("b = %s\n",b);

a[0] = '9';
a[1] = '9';
a[2] = '9';
a[3] = '9';

b[0] = '1';
b[1] = '1';
b[2] = '1';
b[3] = '1';

printf("a = %s\n",a);
printf("b = %s\n",b);
}

これの実行結果が

a =
b = 5678
a = 9999
b = 56781111

です。

177 :デフォルトの名無しさん:02/04/23 19:59
終端文字の分余分にバッファを確保しろ

178 :デフォルトの名無しさん:02/04/23 20:00
×char a[4],b[4];
○char a[5],b[5];


179 :172:02/04/23 20:02
普通の文字配列よりも1バイト余分に
必要なのですか?

180 :デフォルトの名無しさん:02/04/23 20:09
文字列として使うんじゃないなら別に要らない。

181 :デフォルトの名無しさん:02/04/23 20:10
>>179
C言語において文字列は末尾に終端文字として '\0' が必要なので、
バッファもその分余計に必要。

182 :デフォルトの名無しさん:02/04/23 20:11

a[0] = '9';
a[1] = '9';
a[2] = '9';
a[3] = '9';
a[4] = '\0';

b[0] = '1';
b[1] = '1';
b[2] = '1';
b[3] = '1';
b[4] = '\0';

183 :デフォルトの名無しさん:02/04/23 20:13
>>180
はうそつきです

184 :デフォルトの名無しさん:02/04/23 20:15
>>183
レスの前の方は読んでないから適当なこと書いてるかもしれん。
まあ気にすんな。

185 :172:02/04/23 20:22
>>179
a[4]で4文字+\0の5バイト・・・ではない??

186 :172:02/04/23 20:23
↑間違えました。
>>181
>>182

187 :デフォルトの名無しさん:02/04/23 20:32
ではない。

188 :デフォルトの名無しさん:02/04/23 20:34
>>183
うそつきではないだろ

189 :デフォルトの名無しさん:02/04/23 20:35
>>185
a[5]でa[0]からa[4]までの5つの要素を確保できる。

190 :172:02/04/23 20:38
>>189
・・・文字列の終わりの\0の他に、
配列の終わりの\0も必要ということでしょうか?

191 :デフォルトの名無しさん:02/04/23 20:40
>>190
'\0'を入れるスペースが必要でしょう。
"ABCD"なら{'A','B','C','D','\0'}で5つ

192 :172:02/04/23 20:51
>>190
C言語学んで5年間、とんでもない勘違いをしていたみたいです。
a[5]って「aという名前で5つ分確保」って意味だったんですね。
「[5]まで使える」んだと思ってました。
ああもうなんて情けない恥ずかしい・・・。

皆様、本当にご教授ありがとうございました!

193 :デフォルトの名無しさん:02/04/23 20:52
>>192
周りにCに詳しい人がいなかったんだね。かわいそう。

194 :デフォルトの名無しさん:02/04/23 20:54
C言語の標準ライブラリに"文字列"として与えるのならば
すべて'\0'で終端された文字列でなければならない。

そういう用途にまったく使わないで単なるメモリイメージとして使うだけなら終端文字は不要。

何度も同じことを言い直しているだけな罠。

195 :172:02/04/23 21:00
>>193
いることはいるんですけど、プログラムについて聞くと
「それを調べるのがお前の仕事」と。
まぁそれはその通りなんですけどね。
でもこれでやっと他プログラムのバグの謎も解けました。

こんな初歩的なところで皆様の手を煩わせてしまって
申し訳ないです・・・。

196 :デフォルトの名無しさん:02/04/23 21:04
>>195
もしかしてmallocでも同じミスをされていたり?こちらの方はちょっと
ダメージが大きくなります。ヒープ領域が壊れてしまいますから。

197 :172:02/04/23 21:08
>>196
いえ、そんな難しいの、使ったことが・・・。
業務で使ってるのはPL/Iで、Cは会社の
研修で使うだけなもので・・・。

役立たずPGなので逝ってきます・・・。

198 :デフォルトの名無しさん:02/04/23 21:10
>>197
なるほど。周りの方々も不親切だったと。
気が向かれたらまた書き込みして下さい。

199 :172:02/04/23 21:16
>>198
なんて温かいお言葉を・・・!
涙でディスプレイが見えません!!本当に!

皆様、ありがとうございました。ご恩は忘れません!

200 :デフォルトの名無しさん:02/04/23 21:17
いいスレだね

201 :デフォルトの名無しさん:02/04/23 21:34
>>171
ようやくやってる事が判ったよ。COOL!

202 :新入:02/04/24 00:11
プログラム初心者にとってCは、
何をどうやって地道にやってけば良いのでしょうか…??

203 :デフォルトの名無しさん:02/04/24 00:26
打つ。

204 :デフォルトの名無しさん:02/04/24 00:28
読む。打つ。買う。

いまいちか

205 :デフォルトの名無しさん:02/04/24 00:29
>>202
良い本を買って、読みながら実際コンパイル・実行していけば、
なんとかなるよ。

良い本は、>>1にリンクがある推薦図書のスレでどうぞ。

個人的お薦めは、K&Rは辞書だと思ってまず買うとして、
それ以外に、本屋にある一番薄くて安い本を買うことです。
高くて厚い本は、読んでいるうちにきっと萎えます。

206 :デフォルトの名無しさん :02/04/24 00:29
やっぱ日下部先生、最高だわ

207 :デフォルトの名無しさん:02/04/24 00:51
>>205
萎えるというか、持って開くのが億劫になってくる。
例:らくだ2nd、プログラミング言語C++3rd

208 :デフォルトの名無しさん:02/04/24 03:35
C++3版はおもしろいよ。
読んどいて損なし。

209 :デフォルトの名無しさん:02/04/24 03:37
俺も、重い本ってあまり好きじゃないなぁ。3冊に分けて欲しい。

210 :デフォルトの名無しさん:02/04/24 04:07
>>202
言語にとらわれちゃだめだぞ。
Cなんて所詮は単なる翻訳でしかないのだから。
大事なことはプログラムってのは手段であって目的ではないって事。
なにをするためのプログラムなのかを考え、それを実現する過程をしっかりと
自分の頭の中で組み立て消化すればおのずと必要な処理の流れがわかってくる
から、それを該当する言語(たとえばC言語ね)で表現するにはどんな構文を
使えばいいのか調べればよい。

プログラミング言語は言葉なんだよ。
どんなに流暢に話せても中身のない言葉には説得力もなければ感動もない。

211 :デフォルトの名無しさん:02/04/24 04:11
ハイハイ、お疲れ様。

212 :デフォルトの名無しさん:02/04/24 04:20
(*´д`) 最後の二行・・・ハズカシクナイ?

213 :デフォルトの名無しさん:02/04/24 04:25
ともっちを見習いたい者だ。

214 :デフォルトの名無しさん:02/04/24 04:27
オサーンのオナーニ講釈。聞かされるほうはたまったもんじゃないってヤツ。

215 :デフォルトの名無しさん:02/04/24 04:27
(*´д`) ともっち・・・ハァハァ

216 :デフォルトの名無しさん:02/04/24 04:52
C/C++マンセ!

217 :_:02/04/24 14:21
class cA;
class cB;
delete (cA*)(new cB)

これってcAのコンストラクタが呼ばれるのは分かるんだけど
メモリはちゃんとcBのサイズ分解放されるのかな?
それともcAのサイズ分解放される?

218 :デフォルトの名無しさん:02/04/24 14:26
C++相談室があるやん…

219 :_:02/04/24 14:30
すみません。
よく考えたら

struct sA;
struct sB;

free((sA*)malloc(sizeof(sB)));

ってちゃんとsB分解放される・・・と思うから
ちゃんとcB分解放されるんですね。
ヒープ上のメモリって自分の大きさを分かってるんだ。凄いなー。


220 :デフォルトの名無しさん:02/04/24 15:09
>>197
ニッチな御仕事ですなぁ。          (;´д`).。oO( PL/I. )
まぁ、そっちの仕事をなさっていても、懸命にやっていれば
得るものがたくさんあると思うので、
いつか C言語の仕事が来ても
なんとかなるでしょう。
ガンガレ (・∀・)


221 :デフォルトの名無しさん:02/04/24 15:10
日下部タン、荒らすのはやめましょう

222 :デフォルトの名無しさん:02/04/24 16:00
>>219
そうですね。freeにしろ、deleteにしろ、ユーザーが与えるのはオブジェクトへの
ポインタだけで、サイズは与える必要がないですもんね。
でもcAのデストラクタに変な物が入っていたらどうなるんだろう。
以降の議論はC++相談室で。

223 :デフォルトの名無しさん:02/04/24 16:12
>>219
以下のコードは正しく動作しない。C風のキャストはやめよう。

class cA {
int *i;
public:
cA() : i(new int(0)) {}
~cA() { int i; }
};

class cB {
double *d;
public:
cB() : d(new double(0)) {}
~cB() { delete d; }
};

int main()
{
delete (cA *)new cB;
}

224 :_:02/04/24 16:44
>>217
コンストラクタ->デストラクタ

>>223
正しくというのはcBのデストラクタが呼ばれないってことですよね?
cB::d*の指してるメモリは残るんだろうけど
new cBで作られたsizeof(cB)分のメモリは解放されますか?

225 :デフォルトの名無しさん:02/04/24 16:59
>>224
sizeof(cB)分のメモリは常に正しく解放されます。

226 :デフォルトの名無しさん :02/04/24 17:14
やっぱ、日下部先生んとこの奥さん最高だわ

227 :デフォルトの名無しさん:02/04/24 17:37
typedef sturuct{
int a;
int b;
}Kou;

Kou kouzoutai[100][100];

kouzoutaiの全部の大きさを知りたい時は,

sizeof(kouzoutai);

sizeof(kouzoutai)*100*100;

のどちらがただしいのでしょうか?

228 :デフォルトの名無しさん:02/04/24 17:45
>>227
前者。後者は配列にする際にパディングが行われてサイズが膨れている
事があるので誤り。

229 :デフォルトの名無しさん:02/04/24 17:46
>>227
じゃなかった、後者は無条件に誤り。

230 :デフォルトの名無しさん:02/04/24 17:53
ここで聞かないで試してみろよ。
一発でわかるから。

231 :230:02/04/24 17:58
>試してみろよ。 一発でわかるから。

と思ったけどまさかその数字を見て判断できない訳じゃないよね。


232 :227:02/04/24 19:48
やったけど、なんで
sizeof(kouzoutai)*100*100;
じゃなく
sizeof(kouzoutai);
なんだろうと思ってさ

233 :デフォルトの名無しさん:02/04/24 19:50
>>228-229
これってホント ? 漏れ、sizeof(kouzoutai) でもパディング考慮したサ
イズを返してくれるもんだと思ってたよ。

動的に確保する時...

Kou *p = malloc(100 * sizeof Kou);

ってやってたけど、まずいの ?

234 :デフォルトの名無しさん:02/04/24 19:53
>>233
試してみればいいだろ。
きっちりpaddingを考慮したサイズを返してくる。
そもそも、構造体のメンバの合計を返しても役に立たないじゃん

235 :デフォルトの名無しさん:02/04/24 20:18
まあ、#define arraysize(x) (sizeof(x) / sizeof(x[0]))
なんてマクロがいくらでも使われているんだから
簡単にわかりそうなもんだが。
>>228-229みたいな知ったか野郎は放置の方向で。

236 :デフォルトの名無しさん:02/04/24 20:34
>>234-235
てか、K&R も持っていないポンポコちゃんは放置
と思う方向で。
(;´д`).。oO( パディングしたサイズ = sizeof( 構造体 ); )


237 :デフォルトの名無しさん:02/04/24 21:16
17スレをあげ

238 :デフォルトの名無しさん:02/04/24 21:16
>>236


239 :デフォルトの名無しさん:02/04/24 21:28
>>230, >>234
「試してみりゃ云々」って奴は、プログラマ辞めたほうが良いぞ。
「やってみた時は、うまく動きました。」って何回聞かされたことか。
まあ、たまたま今回は正しい結果が出るから良いけどさ。

240 :デフォルトの名無しさん:02/04/24 21:44
>>235
#define arraysize(x) (sizeof(x) / sizeof(x[0]))
より
#define arraysize(x) (sizeof(x) / sizeof(x)[0])
のようがよいよ

241 :デフォルトの名無しさん:02/04/24 21:44
>>239は相当苦労してきたに一票

242 :吟味した?:02/04/24 21:49
>>227
一般的には、
sizeof(1要素を示す型) * (確保したい要素数)
だよ。

なので、ふつー
sizeof(Kou) * 100*100;
てする。

で、ここが勘違いしやすいんだけど、
sizeof(配列変数名)
ってやると、その配列全体のサイズが返ってくるのね。
つまり、char buf[100]; て宣言すると、sizeof(buf)は100。

243 :デフォルトの名無しさん:02/04/24 21:50
>>240
なんだよそれ

244 :デフォルトの名無しさん:02/04/24 22:12
>>243
1. sizeof の引数が型ではなく値である場合、括弧は不要。
2. #define の引数は常に括弧つきで利用すべき。
→ sizeof (x)[0]
でしょ。

245 :デフォルトの名無しさん:02/04/24 22:13
意図はわかるが、括弧が足りなくて間違ってる>240

246 :デフォルトの名無しさん:02/04/24 22:17
む、sizeof(x)[0]は
(sizeof(x))[0]じゃなくて
sizeof((x)[0])なのか

247 :デフォルトの名無しさん:02/04/24 22:43
>「試してみりゃ云々」って奴は、プログラマ辞めたほうが良いぞ。
じゃ君は全部脳内コンパイルしているのかい。

>「やってみた時は、うまく動きました。」って何回聞かされたことか
もちろんこういうことはあるし特にCではたまたまうまく動くということはあるから
言いたいことがわからないでもないけどさ。
実際コードを書いてみることで理解が深まると思うんだけど。もちろんそういう際は
様々な試行錯誤をして文献に当たってさらにコードを書いて確認すると言う意味。
今回だってコード書けば一発でわかりそうなんだけど。もし自分の理解を超える
数字になったときには文献に当たるなりこういうところで聞くなりしてさ。

248 :243:02/04/24 22:56
漏れも>>246と同じ勘違いしていた

249 :デフォルトの名無しさん:02/04/24 23:02
#include<stdio.h>
main()
{
char charray[]="あ";
prntf("%s",charray);
printf("い\n");
return 0;
}
でエラーが一つできてしまいます。何がまずいでしょうか?
コンパイラはvisual c++です。
これcでも使えますよね?

250 :デフォルトの名無しさん:02/04/24 23:04
prntf

251 :デフォルトの名無しさん:02/04/24 23:04
>>249
prntf -> printf

エラーについて聞くときは、エラーメッセージも添えて。

252 :デフォルトの名無しさん:02/04/24 23:06
prntf()
なんて関数はない

253 :249:02/04/24 23:06
エラー 0、警告 1
としか出なかったので書かなくていいと思っていました。ゴメンナサイ

254 :デフォルトの名無しさん:02/04/24 23:07
prntf() は、C (小文字で書くなぁ〜。) でも、VC++ でも (自分で定義し
なきゃ) 使えねーぞ。つーか、このエラーがエラーメッセージ見てわかん
ないなら、VC++ なんか使うなよ。

という、書き込みが多数あるものと思われ...。

255 :252:02/04/24 23:07
あぁ、かぶりまくり
一応付加すると、stdio.hに
prntf()という関数はないということで。

256 :デフォルトの名無しさん:02/04/24 23:08
>>253
どういう設定したら、そう言う表示になるんだ ?

257 :デフォルトの名無しさん:02/04/24 23:16
コンパイルエラーにはならないだろ。
リンカエラーにはなるけど。そういうことだと予想

258 :デフォルトの名無しさん:02/04/24 23:19
理解できてないうちは「警告をエラーとして扱う」オプションいれとけ。

259 :デフォルトの名無しさん:02/04/24 23:32
>>258
そうして人はキャストを多用する

260 :デフォルトの名無しさん:02/04/24 23:33
確かにCはstatic_castやconst_castが無いのが痛いな…

261 :デフォルトの名無しさん:02/04/25 00:24
spawn系で作成したプロセスのstdinを取得したいんですけど、
どうやるんですか?
作成したプロセスは入力待ちの状態になるので、stdinに送り込めば
と思ってるんですけど・・・


262 :デフォルトの名無しさん:02/04/25 00:29
>>261
dup(), dup2() かな。

263 :デフォルトの名無しさん:02/04/25 02:16
「試してみて正しかったです」だけでなくて、
○言語仕様や処理系依存の部分に関しては、資料を調べる
○関数の動作の場合は、机上でも追ってみる
を、併せてやってほしいとは思うけど、関数やモジュールの動作は、
最終的には、動かして結果を見る事への依存度が高い。

だから、日ごろから、動かした結果、資料を調べなくても正しい事が
わかるような、「調べ方」を、身につけて欲しいな、と思う。

そうしてるうちに、言語仕様についても、これについては試せば解かる、
ってのが見えてくるさね。

(だれに言ってるんだろう…)

264 :C房:02/04/25 06:22
Cの事ならなんでも俺に聞け!!

265 :デフォルトの名無しさん:02/04/25 06:24
あっあくまで日下部の代理ってことでおながいします(;´∀`)

266 :デフォルトの名無しさん:02/04/25 06:45
>>264
Cまで逝ったら子供が出来ました。
彼女のメモリーにマウントしてデータを抹殺したいんですけど、どんなコードを書けば良いですか?

267 :デフォルトの名無しさん:02/04/25 06:47
abort

268 :デフォルトの名無しさん:02/04/25 06:49
>>266
unlinkかremoveを使え。
・・・ってファイルじゃないね。
他人のメモリーの領域を勝手に書き換えようとしたらOSにゴルァされないか?

269 :デフォルトの名無しさん:02/04/25 06:50
>>267
中絶かよ!

270 :デフォルトの名無しさん:02/04/25 07:28
>>268
すでにファッキングされてるから大丈夫じゃないのか?


271 :デフォルトの名無しさん:02/04/25 07:29
あげてしまった。スマソ

272 :デフォルトの名無しさん:02/04/25 08:19
semctlで+1すればいい話だったりして。


273 :デフォルトの名無しさん:02/04/25 11:15
a=a+1
ってどういう意味ですか?
数学の世界では絶対にあり得ないことなのですが・・・

274 :デフォルトの名無しさん:02/04/25 11:16
>>273
本読めや。

275 :デフォルトの名無しさん:02/04/25 11:19
手続き型プログラム言語には暗黙の時間指定があります。
よって厳密に数学的に書くと、a(t)を時刻tにおけるaの値として、a(t+1)=a(t)+1であり
何の問題もありません。

276 :デフォルトの名無しさん:02/04/25 11:23
全部読む 最新50 1-100 板のトップ リロード



277 :デフォルトの名無しさん:02/04/25 11:23
っていうか、=は代入で、比較は==ってだけの話じゃん。

278 :デフォルトの名無しさん:02/04/25 11:25
>>274
数学の本や参考書などをみましたが余計解らなくなりました。
この方程式はどうやって解くんですか?

279 :デフォルトの名無しさん:02/04/25 11:31
>>278
一から十まで全部人に聞く気かよ。

280 :デフォルトの名無しさん:02/04/25 11:33
いやタイトルに聞けと書いてあるので・・・・

281 :デフォルトの名無しさん:02/04/25 11:35
>>278
aが極めて大きな数でも成り立たないか?

282 :デフォルトの名無しさん:02/04/25 11:35
>>280
1にFAQ読め、K&R読め、アヒル本読めって書いてあるじゃん。

283 :デフォルトの名無しさん:02/04/25 11:36
つまらないネタで引っ張るなよ。

284 :仕様書無しさん:02/04/25 11:41
C言語のプログラムを代数的記述に置き換えることはできるんですか?

285 :デフォルトの名無しさん:02/04/25 11:42
>>281
1から数学を勉強しテクださい

286 :デフォルトの名無しさん:02/04/25 11:48
∞ = ∞ + 1
ってことじゃないの?

287 :デフォルトの名無しさん:02/04/25 12:10
どこに書けばいいのかわからないので、ここに書いてみるが、
Windowsのフォルダ名がスペースを含む事を許さず、
かつ、フォルダ(ディレクトリ)の区切りを\じゃなく、素直に/にしてくれていたら
人生もっと明るく生きれたなぁ って思ったことはありませんか?



288 :デフォルトの名無しさん:02/04/25 12:29
>>287
童姦。ドライブレター自体うざい。


289 :デフォルトの名無しさん:02/04/25 12:33
>>286
-∞=-∞+1

だめなやつは何をやってもだめな式。

290 :デフォルトの名無しさん:02/04/25 12:34
PGにならなければもっと明るく生きれたんじゃないか、と思います。

291 :デフォルトの名無しさん:02/04/25 12:42
隣の芝村は青いね。

292 :デフォルトの名無しさん:02/04/25 13:19
>>287
Cygwinいれれば?

293 :デフォルトの名無しさん:02/04/25 15:15
>>292
BOW
http://yougo.ascii24.com/gh/13/001358.html

294 :デフォルトの名無しさん:02/04/25 16:15

関数を定義・宣言するときに戻り値の型を void にしておいて、
return を下記のように使うのって、やめた方がいいですか?
個人的には途中で処理がブッタ切レルのでいいかなと思うんですが。

何かまずいことあるでしょうか?

void func(){
return;
}

295 :デフォルトの名無しさん:02/04/25 16:15
typedef struct _aa{
int a;
int b;
}aa;

int
main(){

aa **AA;

AA = malloc(sizeof(aa) * 100);
AA[0]->a = 1;

のように確保した領域にアクセスしようとすると、落ちるんですが、なぜですか?


296 :デフォルトの名無しさん:02/04/25 16:25
>>294
まったく問題なし。

297 :デフォルトの名無しさん:02/04/25 16:26
>>294
> 何かまずいことあるでしょうか?
特にない。

>>295
> のように確保した領域にアクセスしようとすると、落ちるんですが、なぜですか?
配列とポインタのしくみを良く理解していない為、

配列を確保したいなら
> aa **AA;
aa *AA;
としよう


298 :デフォルトの名無しさん:02/04/25 16:31
>>295
なんか深みにハマってきてるなぁ。

aa *AA;
aa **BB;

AA = (aa *)malloc(sizeof(aa) * 100);
AA[0].a = 1;

BB = (aa **)malloc(sizeof(aa *) * 100);
BB[0] = (aa *)malloc(sizeof(aa));
BB[0]->a = 1;


299 :デフォルトの名無しさん:02/04/25 16:39
>>298
ソレダ!!

300 :デフォルトの名無しさん:02/04/25 16:40
ついにこの時がやってきた
300キタ━━━━━━(゚∀゚)━━━━━━!!!!

301 :295:02/04/25 16:40
>>298
そうだそうだ
やりたいことは

AA = malloc(sizeof(aa *) * 100)
for(i<0;i<100;i++)
AA[i]=malloc(sizeof(aa));

AA[0]->a = ...

で、できました!
サンクスコ!

302 :デフォルトの名無しさん:02/04/25 16:46
>>301
ねぇ、

aa AA[100];で事足りない?


303 :295:02/04/25 16:50
>>302
その「100」を動的にとるように変えてハマッテタのれす。

304 :デフォルトの名無しさん:02/04/25 16:56
>>303
aa *AA;

AA = malloc(sizeof(aa) * i);

じゃだめ?





305 :デフォルトの名無しさん:02/04/25 17:01
>>302 >>304
  ?  ?
? (゚д゚) ? なんで2次元配列を1次元にするの?

306 :295:02/04/25 17:15
一応、正確にいうと、
今までグローバルに
*AA[n];
と取って使っていたのを、nを動的に取るようにしたために
グローバルに
**AA;
と取るようにして初期化ではまっていたのdeath

307 :デフォルトの名無しさん:02/04/25 17:20
#include <stdio.h>
int main(void)
{
int num, i;

printf("2以上の整数を入力\n");
scanf("%d", &num);

for(i=2;i<=num;i++){
if(num == i){
printf("%dは素数です\n", num);
}

else if(num%i == 0){
printf("%dは素数ではありません\n", num);
break;
}
}

return 0;
}

すみません、ド初心者なんですが質問させて下さい。
上のコードは、入力された数字が素数かどうかを判断するコード
なんですが、何故 if(num == i) で素数と判断されるかが解らないんです。
どなたか教えて下さい。

308 :デフォルトの名無しさん:02/04/25 17:27
iがnumまで回るということは、
自分自身(num)以外では割り切れなかったということだから。

309 :307:02/04/25 17:40
なるほど、どうもです。

310 :デフォルトの名無しさん:02/04/25 19:01
>>301

typedef struct _aa {
int a;
int b;
} aa;

int main(void)
{
aa *AA;
aa **BB;

AA = (aa *)malloc(sizeof(aa) * 100);
AA[0].a = 1;

BB = (aa **)malloc(sizeof(aa *) * 100);
BB[0] = (aa *)malloc(sizeof(aa));

/* 下の二行は同じ意味 */
BB[0]->a = 1;
BB[0][0].a = 1;

return 0;
}

311 :デフォルトの名無しさん:02/04/25 19:32
>>309
なんだか、豪快なアルゴリズムだな…

312 :マッハ若乃花:02/04/25 19:37
先生!ctime()の出力に\nが何故か付きます!
\nいりません!おいら,どうしたらいいでしょうか!?

313 :デフォルトの名無しさん:02/04/25 20:00
>>307
for(i=2;i<=num;i++){

for(i=2;i*i<=num;i++){
でいいんじゃないの?


314 :デフォルトの名無しさん:02/04/25 20:01
>>313追記
もっと変える必要があるか。

315 :先生:02/04/25 20:02
>>312
自・分・で・け・ず・り・な・さ・い(はぁと)

もしくは、strftime()を使おう。

316 :デフォルトの名無しさん:02/04/26 02:06
スレ違いっぽいですが
K&Rの正誤表って何処にあるんでしょうか?
vectorにあるって見たのですが、見つかりません。

317 :デフォルトの名無しさん:02/04/26 02:08
http://www.vector.co.jp/soft/data/prog/se028589.html

318 :デフォルトの名無しさん:02/04/26 02:09
有難う御座いました。

319 :デフォルトの名無しさん:02/04/26 02:20
スレ違いなのはわかってます。。。

いままではプログラムの本を買って読むとき、読むだけではなかなか頭に入らないので
ノートに本の内容をはじめから最後までまとめていました。おかげで600ページほどの本をまとめるのに
2ヶ月ぐらいかかってました。さすがにこれではまずいなと思い、現在は一度読んで大体の内容を頭に入れた後
"何ページから○○のことが書いてある"のように自分用目次を作って必要なときに必要な部分
を見れるようにしました。これは効率がよくとても助かりました。他になにかおすすめの学習方法が
ありましたら教えてください。

320 :デフォルトの名無しさん:02/04/26 06:04
読むだけでわかるかけないだろって
実際に作れよ

321 :デフォルトの名無しさん:02/04/26 06:06
>>316
http://www.cs.bell-labs.com/cm/cs/cbook/2ediffs.html
ではなくて?


322 :デフォルトの名無しさん:02/04/26 06:36
論よりrun

323 :デフォルトの名無しさん:02/04/26 07:26
>>319
勉強に使えるコンピュータを持っていないの?

324 :デフォルトの名無しさん:02/04/26 08:46
>>323
私は頭の中でコンパイルしています

325 :デフォルトの名無しさん:02/04/26 08:47
>>322
いい言葉だ

326 :デフォルトの名無しさん:02/04/26 08:51
VBから呼び出すDLLを作ろうと思っているのですが、
VBからByteの配列を受け取り、その配列の内容を変えてまたVBに返す方法(宣言)を
教えてください。


327 :仕様書無しさん:02/04/26 08:51
128bitのプロセッサが出てきたらC言語も何かキーワードを追加するんでしょうか?

328 :デフォルトの名無しさん:02/04/26 08:59
>>326
おそらくこんな感じ。
(lengthはお好みで。)

int __stdcall hoge(unsigned char *bytes, int length)
{
 pBytes[0] = 0xff;
 :
 :
}

>>327
C++++あたりの言語が出そうな予感

329 :デフォルトの名無しさん:02/04/26 09:18
pBytes[0]って何を表すのですか?

330 :sage:02/04/26 09:21
>>329
失礼、bytes[0]の間違い。
バイト配列の先頭の要素ね。

331 :デフォルトの名無しさん:02/04/26 09:22
名前にsageって入れちゃった…
鬱だし脳

332 :デフォルトの名無しさん:02/04/26 09:25
やってみましたができませんでした…
配列の内容が反映されていませんでした。

333 :デフォルトの名無しさん:02/04/26 09:30
int __stdcall Search(long m, unsigned char *P){
long r;
/*なんか処理*/
P[r]=1;
return 0;
}
って感じなのですが…

334 :デフォルトの名無しさん:02/04/26 09:41
自己解決しました。お騒がせしました。

VBでいう true ってVCではどうあらわせばいいんでしょうか?

335 :デフォルトの名無しさん:02/04/26 09:59
>>334
16bit

336 :319:02/04/26 11:09
コンピューターは持ってません。買いたいのですがお金がありません。
貯金で5万円ぐらいです。

337 :デフォルトの名無しさん:02/04/26 11:11
コンピューターに触れるのは学校だけです。放課後はつかえません

338 :デフォルトの名無しさん:02/04/26 11:59
>>336
5万円あればPC買えるんで、買え

339 :デフォルトの名無しさん:02/04/26 16:03
#include <stdio.h>
#include <stdlib.h>
#include <curses.h>

int
main(void)
{
WINDOW *s;
FILE *fp=NULL;

if ((fp = fopen("/home/hoge/testfile", "r")) != NULL)
free(fp);
s= initscr();clear();endwin();exit(0);
}

なぜかこれでセグメンテーションフォルトが出ます.

gdb で調べると
#0 0x400c3aef in _IO_adjust_column () from /lib/libc.so.6
#1 0x400c3bed in _IO_flush_all () from /lib/libc.so.6
#2 0x400c3da1 in _flushlbf () from /lib/libc.so.6
#3 0x40083ed4 in exit () from /lib/libc.so.6
#4 0x0804ac46 in main (ac=1, av=0xbffffbd4) at main.c:43
#5 0x4007117f in __libc_start_main () from /lib/libc.so.6
ライブラリの問題なんでしょうか..


340 :デフォルトの名無しさん:02/04/26 16:14
>>339
free(fp); って一体…。


341 :デフォルトの名無しさん:02/04/26 16:15
とりあえず、mallocしたとは限らないfpをfreeすんなよ‥‥

342 :デフォルトの名無しさん:02/04/26 16:27
あぁ!まじ鬱だ。
fclose(fp)でした!
なんでこんな間違いを。。。



343 :デフォルトの名無しさん:02/04/26 16:32
Linuxでgetch()はないんですか?


344 :デフォルトの名無しさん:02/04/26 16:35
>>343
getchってconio.hにある関数だっけ?
だとしたらないと思う。

345 :デフォルトの名無しさん:02/04/26 16:36
cursesにはある.<linux



346 :デフォルトの名無しさん:02/04/26 16:37
c faqで何回も読んだ.
http://www.catnet.ne.jp/kouno/c_faq/c19.html#0


347 :デフォルトの名無しさん:02/04/26 16:39
>>346
あっそ。
だからどうしたの?

348 :デフォルトの名無しさん:02/04/26 16:49
>>345
出来ました。ありがとう。

349 :デフォルトの名無しさん:02/04/26 21:04

>>339 >>342
マジレス。
とりあえずデバッグにデバッガ使うのは当分やめといた方が良い。
ある程度の量と質をこなせるようになるまでは printf とコンパイラのエラーメッセージで我慢する。

350 :デフォルトの名無しさん:02/04/26 21:18

>>319
本でプログラムを勉強するとは、根性あるなぁ。

自作なら十分な金額なんだけど、
一台目はメーカー品の方が、安心できるからなぁ。
あと、月々の通信費もかかるし。

近くの公共施設とか当たってみ。
あとは、自作に詳しい友人とか。
なきゃぁ、バイトだな。

プログラムの勉強頑張れよ。
何か作れるのは楽しいぞ。


スレ違いなのにマジレス スマソ >> その他のみなさん
スレ違い sage

351 :デフォルトの名無しさん:02/04/27 01:27
>>319
すげえ。
いや、まじでそれ貫いてくれ。


352 :デフォルトの名無しさん :02/04/27 02:29
ソースコード書いて覚えられるものなのか?感心した!

PCは大学とかに落ちてるの拾ってきて、Linux入れれば(・∀・)イイ!

あ、5万あるんなら中古でノーパソでも買うほうが善いな。

353 :デフォルトの名無しさん:02/04/27 02:40
5万なら、かな〜り速いマシン買えるよ。
それにSolarisかBSDかLinux入れよう。

354 :デフォルトの名無しさん:02/04/27 03:02
>>319みたいな人はLinuxがよく似合う、っと。
もちろんイイ意味で。

355 :デフォルトの名無しさん:02/04/27 03:54
十読は一写に如かず。
プログラムのみならず、全てに当てはまる事だな。

356 :デフォルトの名無しさん:02/04/27 04:36
VBから文字列を受け取りたいのですがどうすればいいでしょうか?

DLL_API int __stdcall hoge(long a, char *b){

で失敗しました…化けてしまいました。

357 :デフォルトの名無しさん:02/04/27 05:17
>>349
構造体沢山書く

free専用の関数をfree_Typename(Typename *)で記述する

fcloseの存在を忘れる(解放=freeと頭の中に焼きついてしまう)

fopen->free ???

という感じでした

*いっそのこと#define free_File(fp) fclose(fp)でもしとこうか..


358 :デフォルトの名無しさん :02/04/27 05:21
貧乏人のPC-UNIX万歳!

359 :デフォルトの名無しさん:02/04/27 05:43
ゴースト(自分のベスト記録と同じ動作をするもの)の実装をやってるんですが。
どういう構造が良いのでしょうか。

まずゴーストの記録を取るのですが
自分が考えたものとしては,selectとwhileで回しているループ中で

1.イベントが起きるとその時の時刻とイベント内容,状態を取得して配列にする

2.特定時刻ごとの状態のみを取得して配列にする

の二つを考えました。

1はイベント数によって配列の長さが変わり要reallocの可能性があります。
イベント内容を取得しておけるのでリプレイ(ゴーストとは別)がしやすそうです。

2は時刻が固定されてるので配列も固定で良さそうです。
ゴーストの実装も1に比べ楽そうです。

今1を採用しているですがプレイ中にreallocするのはどうも嫌な気分です。
2の方が良いのでしょうか。




360 :デフォルトの名無しさん:02/04/27 06:12
>>357
他人が見たときバカにされるよ。

361 :デフォルトの名無しさん:02/04/27 06:39
お前ら教えて下さい。

小生は現在VC++を使っています。
mallocで大きな配列を宣言して2次元配列のように
使いたい場合に、

matrix[i*n + j] と指定するのが見にくいので

#define matrix(i, j) matrix[i*n + j]
main()
{
  int n = 3;
}
として使っているのですが
これはまずいのでしょうか。

362 :デフォルトの名無しさん:02/04/27 07:05
nが宣言されているところで使えば大丈夫。

363 :デフォルトの名無しさん:02/04/27 07:06
まずい

364 :デフォルトの名無しさん:02/04/27 07:06
>>361
どこからもmatrix()呼び出してないからちゃんと動く。
>>360

365 :デフォルトの名無しさん:02/04/27 07:08
>>361
偉そうな割に頭悪すぎ。

366 :デフォルトの名無しさん:02/04/27 07:10
>>361
matrix(x,y) = 13;

C++でやれば参照と勘違いされ(そもそもマクロ使用自体がナンセンス)、
Cでやれば気味悪がられる。

俺も>>360に一票。


367 :デフォルトの名無しさん:02/04/27 09:20
>>359
ゲームは通常、一定時間を単位としてプログラムします。
http://pc.2ch.net/test/read.cgi/tech/1011722640/838-

で、例えば1/60秒を1単位(1フレーム)としてプログラムした場合、
1秒間に60回分のキーの状態を記録しておけば、完全なリプレイ
(=ゴースト)が再生できます。

レースゲームで、使うキーが上下左右+アクセル+ブレーキの6bitなら、
1回分は1バイトで足りるので、1秒間に60バイト。1分間で3600バイト。
1時間で216000=約210KBで足ります。

重要なのは、「キー入力イベントが発生することによってゲームの
処理をするのではなく、プログラム側のタイミングでキーの状態を
読みに行く」ようにプログラムすることです。

つまり、>>359の2が正解。

368 :デフォルトの名無しさん:02/04/27 10:08

>>357

その使いかただけを見ると、
close(閉じる) と、 free(解放)に対する理解が不十分と思われ。
ごっちゃになってる。

1度、別々に突っこんで調べてみるといいと思う。


>>360 >>366
このスレの厨房占有率が少しでも下がるから、
1行でいいからアドバイスしてやれよぉ。

369 :デフォルトの名無しさん:02/04/27 10:34
理解もなにもねーだろ(w

*alloc->free
fopen->fclose
と対にして覚えればいいだけじゃねーか(w

370 :デフォルトの名無しさん:02/04/27 11:41
知識に頼ってプログラムを組むなら、
もっと簡単に沢山のことをできる言語があるよ。


371 :デフォルトの名無しさん:02/04/27 12:09
>>361
とりあえずね。
#define matrix(i, j) matrix[(i)*n + (j)]
って書け。

372 :デフォルトの名無しさん:02/04/27 12:27
>>368
そもそもそんな怪しげな形にdefineしない。

373 :デフォルトの名無しさん:02/04/27 12:30
>>368
後、気持ちはわからないことはないけどそれなら2次元配列使えば済む話ではと。

374 :デフォルトの名無しさん:02/04/27 13:43
>>373
mallocと書いてあるので二重ポインタでそう。

375 :デフォルトの名無しさん:02/04/27 14:24
>>374
つぅかソースの全容見ないと何ともいえないよ。
やつが書いたコードdefineマクロ使ってないし。w

376 :koubouU:02/04/27 16:26
整数nを入力したとき1からnまでの奇数の和を表示するプログラムを作りなさい。

考えても考えてもわかりません。
+2を使うべきかー2を使うべきか・・・・変数は最低何個で作れるのか・・・
教えてください。限界です。

377 :デフォルトの名無しさん:02/04/27 16:31
>>376
for(sum=0,k=1;k<=n;k+=2) sum+=k ;
printf("%d\n",sum) ;

378 :デフォルトの名無しさん:02/04/27 16:43
つーかでかいもん作ってるわけでもないんだったら
#defineはあんま使うな

379 :koubouU:02/04/27 16:48
>>377.>>378
ちょっと説明不足でした。使える関数は
printf scanf while 程度でお願いします

380 :デフォルトの名無しさん:02/04/27 16:52
>>379

int sum,k,n;
scanf("%d",&n);
sum=0;k=1;
while(k<=n){sum+=k;k+=2;}
printf("%d\n",sum);

whileは関数じゃないよ

381 :デフォルトの名無しさん:02/04/27 16:54
っていうか宿題は友達に聞けよ。

382 :koubouU:02/04/27 16:57
>>380
whileは関数ではないんですか!?〜();
〜に当てはまるものは関数だと思ってたのに・・・

答えはちゃんと出ました。ありがとうございます。

383 :koubouU:02/04/27 16:59
sumって合計って意味だったんだ・・・

384 :デフォルトの名無しさん:02/04/27 17:01
宿題は宿題スレに

宿題、手伝おっか?
http://pc.2ch.net/test/read.cgi/tech/1011722640/

385 :koubouU:02/04/27 17:02
>>381
トモダチにそんなこといってもわかりませんよ
たぶんバカにされるだけだと

386 :デフォルトの名無しさん:02/04/27 17:03
int n;
scanf( "%d", &n );
printf( "%d"), (n+(n&1))*((n+1)>>1)>>1 );

387 :koubouU:02/04/27 17:04
>>384
わかりました

388 :385:02/04/27 17:14
一足遅かったのか?(´Д`)

389 :388==386:02/04/27 17:15
388の名前は386の間違い

390 :デフォルトの名無しさん:02/04/27 17:15
うわーん(TДT)
また遅れた・・

391 :デフォルトの名無しさん:02/04/27 17:34
すみません 突然ですが
2つの文字列str1、str2を引数として受け取り、両者が同じ文字列の場合に
int 型の 1、異なる場合には 0 を返す関数 str_eq をつくりなさい。

int str_eq(char *str1, char *str2)
{
int hantei=0,i;

for(i=0;i<3;i++){
if(str1[i]==str2[i])
hantei=hantei+1;
else
hantei=0;
}
if(hantei=3)
hantei=1;
else
hantei=0;
return(hantei);
}
こう作ったのですがうまくいきません何が悪いのでしょうか?
よろしくお願いします。

392 :デフォルトの名無しさん:02/04/27 17:35
int str_eq(const char* str1, const char* str2)
{ return !strcmp(str1, str2); }

393 :デフォルトの名無しさん:02/04/27 17:38
>>391
突っ込みどころ満載。とりあえず、2つの文字列str1、str2の文字数が3文字だと思ってるようですが、なぜ3文字だと思ってるのでしょうか。それも問題文に定義されてるのん?

394 :デフォルトの名無しさん:02/04/27 17:38
宿題は宿題スレで!

395 :デフォルトの名無しさん:02/04/27 17:39
>>391

まず「文字列」の定義を確認する。

396 :デフォルトの名無しさん:02/04/27 17:42
>>392
ソースから判断するに標準関数は多分使わないんじゃないかと。

397 :デフォルトの名無しさん:02/04/27 17:45
>>391
正解は、誰か書くだろうからいいとして、プログラム中の 3 ってなんだ ?

あと、うまくいかないなら「どううまくいかないか」書かないとダメだ
よ。みんなそれ見て、君のレベルを推定することができるしね。


398 :デフォルトの名無しさん:02/04/27 17:46
正解はすでに392で出ているような・・・
あえて言うなら!がイヤーンな感じだが。

399 :デフォルトの名無しさん:02/04/27 17:47
int str_eq(const char* str1, const char* str2)
{
int c = 0;
while (str1[c] == str2[c]) c++;
return c == strlen(str1);
}


400 :デフォルトの名無しさん:02/04/27 17:51
>>399
それだと、str_eq("", "") で、str1[1] を参照して、あぼーんするぞ。
初歩からやり直せ。

401 :穴埋め *** & +++:02/04/27 17:54
int str_eq(char *s1,char *s2)
{
int i;
for(i = 0; *** ;i++)
if( +++ ) return 1;
return 0;
}


402 :デフォルトの名無しさん:02/04/27 17:54
>>399
なんでこんな、無謀なプログラム書けるのよ。
str1 か str2 の終端まで達しているか確認せずにいきなり比較なんかす
るなよ。あと strlen() 使うぐらいなら、>>392 でいいんじゃねーのか。

403 :デフォルトの名無しさん:02/04/27 17:55
>>391

int str_eq(char *str1, char *str2){
if(!str1 || !str2) return 0 ;
do{if(*str1 != *str2) return 0 ;}while(*(str1++) && *(str2++)) ;
return 1 ;
}

404 :デフォルトの名無しさん:02/04/27 17:55
int str_eq(const char* str1, const char* str2)
{
if(strcmp(str1,str2))
return 0;
else
return 1;
}


405 :デフォルトの名無しさん:02/04/27 17:57
int str_eq(const char * str1, const char * str2)
{
do {
if ( *str1++ != *str2++ ) return 0;
} while ( str1[-1] );
return 1;
}


406 :デフォルトの名無しさん:02/04/27 17:58
>>399
わざと?

407 :デフォルトの名無しさん:02/04/27 17:59
っていうか、392がベストか。
ANSI Cだと!0 == 1のはずだし。

408 :デフォルトの名無しさん:02/04/27 18:00

int str_eq(const char* str1, const char* str2)
{
return *str1!=*str2 ? 0: *str1 ? str_eq( str1+1, str2+1 ) : 1;
}

409 :デフォルトの名無しさん:02/04/27 18:03
>>408
stack over flow

410 :デフォルトの名無しさん:02/04/27 18:04
>>408 芸術だわ。

411 :デフォルトの名無しさん:02/04/27 18:08
int str_eq(char *s,char *p)
{
int i = 0;
while(s[i] && p[i])
if(s[i] == p[i])
i++;
else
return 0;
if(s[i] == '\0' && p[i] == '\0')
return 1;
return 0;
}

412 :408:02/04/27 18:09
え?問題なくない?


413 :デフォルトの名無しさん:02/04/27 18:10
>>412
gcc以外は末尾再帰最適化してくれないし。

414 :デフォルトの名無しさん:02/04/27 18:18
>>408
なにかLISPのような・・・w

415 :デフォルトの名無しさん:02/04/27 18:38
>>all
ありがとうございます。

>>391,397
問題は3文字指定だったのです。
説明が足りませんでした。

>>397
ご指摘のようにどうダメなのか説明します。
これを実行すると違う文字列なのに1の値
しか帰ってこないで0の値が帰ってきません。



416 :デフォルトの名無しさん:02/04/27 18:44
3文字限定ならこれでいいじゃん。
return str1[0]==str2[0] && str1[1]==str2[1] && str1[2]==str2[2];


417 :デフォルトの名無しさん:02/04/27 18:45
>>416
だな。
マクロでもできそうな感じ。

418 :デフォルトの名無しさん:02/04/27 18:46
これでどうよ。(って、なんか3文字限定とか言ってるし...。鬱だ。)
int str_eq(const char *s1, const char *s2)
{
 return *s1 == *s2 && (!*s1 || str_eq(++s1, ++s2));
}

419 :412:02/04/27 18:48
>>413
VC++.NETで最適化ありで試してみたら一応スタックは無駄遣いしてなかった。
関数2つに分裂してたり無駄な代入が多かったりとなんか萎えるコードだったけど。

420 :デフォルトの名無しさん:02/04/27 18:48
int str_eq(const char *str1,const char *str2)
{
return strcmp(str1,str2)?0:1;
}

これじゃだめなの?

421 :デフォルトの名無しさん:02/04/27 18:49
だめ

422 :デフォルトの名無しさん:02/04/27 18:50
>>416
ありがとうございます。
もしよろしければ私の作った関数は
どこが間違っていたのか教えてもらえないでしょうか?

423 :↓勉強だからだろ!:02/04/27 18:53
>>421
なんでだYO!

424 :デフォルトの名無しさん:02/04/27 18:53
>>422
とっても簡単なケアレスミス
> if(hantei=3)
これ代入してる。
ほかにも問題は無いわけじゃ無いけど、結果には影響しないと思う。

425 :397:02/04/27 18:55
>>415
> 問題は3文字指定だったのです。
うむ、>>395 の姿勢が正しいということだったな。

> これを実行すると違う文字列なのに1の値
> しか帰ってこないで0の値が帰ってきません。

それは、君が...
> if(hantei=3)
と書いているからだな。上のほうで...
> if(str1[i]==str2[i])
と書いているので、'=' と '==' のミスだろうね。コンパイラはなに使ってる ?
使ってるコンパイラによっては、エラーレベルを設定すると警告してくれるものも
あるから、そう言うのを使うのもいいかも知れない。

426 :デフォルトの名無しさん:02/04/27 19:02
>>424、425
ありがとうございます。
大変参考になりました。
>>425
コンパイラはVCを使っています。

427 :デフォルトの名無しさん:02/04/27 19:17
>>423
問題の意図が「strcmpっぽいのを実装しろ」
って事だからだろ




3文字限定で(藁

428 :デフォルトの名無しさん:02/04/27 19:45
char p[][5] = { "hoge", "hage", "foo", "boo" };

char *p[] = { "hoge", "hage", "foo", "boo" };

上のほうが容量食わないけど、文字列を変更しないなら下のほうがいいのかな?

429 :デフォルトの名無しさん:02/04/27 19:51
>上のほうが容量食わないけど、
(゚д゚)ハァ?

430 :デフォルトの名無しさん:02/04/27 19:56
>>429
消費するスタックのことではないかと。

431 :デフォルトの名無しさん:02/04/27 20:07
はぁ?
消費するスタックなら下の方が少ないだろ

432 :430:02/04/27 20:11
>>431
すまん、逆に読んでた。逝ってくる。

433 :361:02/04/27 20:26
>>371-374
確かに二重ポインタが正当だけど面倒でしょ?
二次元配列だとでかい配列つくれないし。

小手先で簡単にサイズ可変の行列作れないかなぁと。

既にC++で行列クラス作ってあるから
それ使えば済むんだけどね

434 :428:02/04/27 20:31
>429
上は5*4=20
下は5*2+4*2+4*4=34
(ポインタが4バイトのとき)
だと思ったけど違う?


435 :デフォルトの名無しさん:02/04/27 21:58
>>434
この宣言が関数内か関数外かどっちだ ? また、気にしているのはスタック領域だ
けか ? 固定文字列領域は気にしなくていいのか ?

436 :428:02/04/27 22:04
スタックと文字列領域両方です。
あと宣言は関数ないかな。


437 :デフォルトの名無しさん:02/04/27 22:14
上はスタックに5*4+4*4で、それ以外に
コピー元の文字列分要るだろ。

438 :デフォルトの名無しさん:02/04/27 22:36
>>437
4*4 ってなんだよ。

439 :デフォルトの名無しさん:02/04/27 22:54
>438
スマソ。ポインタのポインタのパターンと錯覚してた。

440 :デフォルトの名無しさん:02/04/27 23:02
>>437

通常、文字列リテラルはスタックとは別の領域に確保されるが、
charの配列を初期化している場合は文字列定数じやなくて単なる初期化子。
すなわち、
char array[] = "hoge"; /* 宣言と同時に初期化 */

char array[] = {'h','o','g','e','\0'};
と同じで5バイト。

これが"配列の配列"になっても同じ。だから

>>434
> 上は5*4=20

で良い。


一方、下はポインターの配列を宣言すると同時に文字列リテラルの
アドレスを代入してるのでスタックにポインター分と書き込み禁止領域に
文字列リテラル分のメモリー消費でイイんじゃない
(処理系に依存すると思うけど)


# const 指定すれば上も変更できないからどっちでもって感じ >>428


441 :デフォルトの名無しさん:02/04/27 23:05
>440
下でリテラルを含めるなら、上もリテラルを含めるべきでは?

442 :438:02/04/27 23:10
>>439
なら、OK。
と言うことで、上は 4 * 5 = 20, 下は 4 * 4 = 16 バイトがスタック
に取られる。後、双方とも 2 * 5 + 2 * 4 = 18 バイト文字列領域が
必要。(正確には、最低限は。VC なんかだと、文字列の先頭アドレスを
4 バイトバウンダリにおいたりするので、パディング分が更に増える。)

443 :デフォルトの名無しさん:02/04/27 23:12
>>441
ん?
よく考えてみな。
5*4 = 20の5は下の文字列リテラルに当たる、文字配列分。

444 :デフォルトの名無しさん:02/04/27 23:13
char array[] = {'h','o','g','e','\0'};

は初期化。

char *array = "hoge";

とするとこれはポインターへのアドレスの代入(==コピー)。

違いワカル?

445 :デフォルトの名無しさん:02/04/27 23:18
>443
そーじゃなくて。スタックに確保した5*4を埋める為の
「元の」文字列はどこにあるのよ?

446 :デフォルトの名無しさん:02/04/27 23:19
>434
違う。幅が不揃いの配列は作れない。


447 :デフォルトの名無しさん:02/04/27 23:21
>>446
揃ってるけど・・・

448 :444:02/04/27 23:25
ゴメソ

char *array = "hoge";

これも"初期化"なんだけど、ポインターの指し示す先は別にあって、
配列には文字を格納してるって事。

449 :デフォルトの名無しさん:02/04/27 23:27
char p[][5] = … は(5+α)*4バイトの領域が用意される。それに対し
char *p[] = … は(5+α)*2+(4+α)*2+ボインタのサイズ*4バイトの
領域が用意されるから、char p[][5]の方が、必要なサイズは小さいと思う…。

450 :デフォルトの名無しさん:02/04/27 23:27
>>444
char *array = "hoge";
これも初期化だろ。

char *array; array = "hoge";
だったら代入だが。

451 :デフォルトの名無しさん:02/04/27 23:29
>>450
それ同じ

452 :450:02/04/27 23:30
スマン、書いてる間に本人に訂正されてしまった。吊って来る。

453 :441:02/04/27 23:31
つまり、この話は、
char str[] = "abcd";と
char *str = "abcd";
の比較と等価なわけだな。

で、下が、ポインタ4+リテラル5なわけ。
上は、配列5+リテラル5なわけ。
なぜかっちゅーと、上は、内部的には
char str[5]; strcpy(str,"abcd");
と等価で、リテラルの"abcd"が
消えて無くなるわけではないから、

454 :デフォルトの名無しさん:02/04/27 23:32

何で誰も K&R とか $18 の規格書を引用しないのか。

455 :デフォルトの名無しさん:02/04/27 23:34
>char str[5]; strcpy(str,"abcd"); と等価で
うそつくな。
こんなもんは実装依存だ

456 :デフォルトの名無しさん:02/04/27 23:37
晒しage

457 :長いのでもう一回書きます:02/04/27 23:58
LPSTR TextLine[2]={"0","0"};
LPSTR Text[7]={
"あああああああああああああああああ",
"いいいいいいいいいいいいいいいいい"
"ううううううううううううううううう",
          ・・・・・
}

//文字数の調査(文字が長かったら,2行にして表示)
ByteNum=strlen(Text[Seen-1]);
if(ByteNum >= 10){
strncpy(TextLine[0],Text[Seen-1],10);
strcpy(TextLine[1],Text[Seen-1]+10);
}
else{
strcpy(TextLine[0],Text[Seen-1]);
}

458 :デフォルトの名無しさん:02/04/28 00:01
配列Textの文字数が長かったら,TextLine[0]とTextLine[1]に分けたいのですが,
うまくいきません。
strncpyで,TextLine[0]にテキストの途中まで入れるのは,あっていると思うんですけど(バグりますけど),
TextLine[1]にTextLine[0]に入れたテキストの続きをどのようにして入れればいいのかわかりません。

459 :デフォルトの名無しさん:02/04/28 00:03
LPSTR?

460 :デフォルトの名無しさん:02/04/28 00:05
LPSTRってWin32APIで出てきたような機が

461 :悩みつづけて3ヶ月!:02/04/28 00:05
OS:Windows 2000
ソフト:Visual C++ 6.0
3次元配列を定義したいのです。
double val[3][100][100];
上記のように定義してコンパイル時にエラー及び警告は出ないのですが、
実行しようとすると、“メモリがwriteになれない”のような警告が出て
実行することが出来ません。
いろいろやってみたのですが、解決法がわかりません。
どうすればうまくいくのか教えてください。

462 :デフォルトの名無しさん:02/04/28 00:06
Win32ではLPSTR = char *、だったかな?
つか、リテラルを書き換えようとするなよ‥‥

463 :デフォルトの名無しさん:02/04/28 00:06
>>461
メモリを確保しすぎ

464 :デフォルトの名無しさん:02/04/28 00:10
>461
それは、「実行中にエラーが発生した」といって、
「実行できない」とはまた区別するべきでしょう。
原因は「3次元配列の定義」以外の場所にあるでしょう。
がんばってDEBUGするように。
>462
8*3*100*100=240,000byteで確保しすぎかどうかは微妙なところ。

465 :デフォルトの名無しさん:02/04/28 00:14
スタックに確保する量としてはでかい

466 :デフォルトの名無しさん:02/04/28 00:15
http://ascii24.com/news/i/keyp/article/2000/12/08/620623-000.html

リッチィー先生の画像ハケーン!!

467 :デフォルトの名無しさん:02/04/28 00:16
>>464
すまんかった

468 :デフォルトの名無しさん:02/04/28 00:22
>>461
static領域に確保すればどうでしょうか?

static double val[3][100][100];

469 :458:02/04/28 00:24
わすーれーないでー
はったんあみか

470 :デフォルトの名無しさん:02/04/28 00:33
>469=458
>>462

471 :デフォルトの名無しさん:02/04/28 01:23
void func(void)
{
goto mejirushi;
......
mejirushi:
}

というコードに対し、問題なくコンパイルしてくれるgccと、;をつけろと言うVC++6.0はどちらが正しいのですか?


472 :デフォルトの名無しさん:02/04/28 01:26
returnをつかわないあなたが一方的に悪いです。

473 :デフォルトの名無しさん:02/04/28 01:28
>>472
・・・・・。
じゃあ言い直し・・・・


while(1){
goto mejirushi;
......
mejirushi:
}

というコードに対し、問題なくコンパイルしてくれるgccと、;をつけろと言うVC++6.0はどちらが正しいのですか?


474 :デフォルトの名無しさん:02/04/28 01:28
ジャンプ先ラベルには「本文」が必要。
つまり「;」をつけろというVCが正しい。

475 :デフォルトの名無しさん:02/04/28 01:29
>>474
あ、なるほど。
ありがとうございました。

476 :デフォルトの名無しさん:02/04/28 01:34
>473
continueしないあなたが一方的に悪いです(w


477 :475:02/04/28 01:36
>>476
いや、gotoを使うのが一番悪いです(w

478 :デフォルトの名無しさん:02/04/28 01:38
ちなみに
mejirushi:;
なんてことはしないように。
mejirushi:
      ;
インデントをつけとくのがマナー。

479 :475:02/04/28 01:39
>>478
うっ!
今から直します。
(極力使わないようにしていてよかった・・・)

480 :デフォルトの名無しさん:02/04/28 01:44
>>479
意地を張ってでも使わないのが正解。

481 :デフォルトの名無しさん:02/04/28 02:45
>>475
適切につかうべし。

>>480
アホは去れ

482 :悩みつづけて3ヶ月!:02/04/28 03:07
アルゴリズム上どうしても値を保持しておきたいため、確保しておきたい配列なんです。
配列確保が出来るかどうかを確認するために以下のプログラムをコンパイルすると
当然のことながらdを使っていないという警告がでますが、エラーはでません。

#include<stdio.h>

void main (void)
{
int a=1;
double val[3][100][100];

printf("%d\n",a);

return ;
}
しかし、実行すると>461のようになってしまいます。
Cマスターの方々、どうか解決策をお願いします。

483 :デフォルトの名無しさん:02/04/28 03:16
ヒープも使いたくないの?

484 :デフォルトの名無しさん:02/04/28 03:18
>>482
3ヶ月も悩みなさんな。
>>468にもあるが、取り敢えず

static double val[3][100][100];

でやってみてくらさい。
ダメなら次善の策をうpするから。

485 :デフォルトの名無しさん:02/04/28 03:35
>482
当方も、Win2000 VC6Sp5ですが、そのプログラムは
無事に実行されましたが。

486 :デフォルトの名無しさん:02/04/28 03:38
>>482
スタック上にそんなでかいローカル変数を作ってはだめ。
double = 8byte なので 8*3*100*100 = 240KB 近くのサイズがある。
>>484の言うとおり、staticにするか、グローバル変数にしましょう。

デバグ用ならば #ifdef などを使って、必要なときだけ組み込む。

487 :悩みつづけて3ヶ月!:02/04/28 03:44
>485
すみませぬ。

double val[3][300][300] ; の間違いでした。

>484
static を使って定義したらうまく実行できました。
けれども、どうして実行できなかったのでしょうか?


488 :悩みつづけて3ヶ月!:02/04/28 03:46
>486
そうなんですか。
240KBくらいならいいのかと思っていました。
これで一度プログラムを組んでみます。
ありがとうございました。

489 :デフォルトの名無しさん:02/04/28 03:52
>>488
スタック領域はCコンパイラにもよるが、デフォルトで64KB〜256KB程度。
オプションで設定すればもっと取れる。

でもこの中にはプログラムカウンタの情報や戻り値など、各種のデータを
入れるので、キツキツの使い方は危険。

staticはスタック領域ではなく、グローバル領域、もしくはヒープ領域に確保
されるので、スタック領域とは無関係にかなりの大きさを確保できる。どれ
位大きく確保できるかは、処理系依存。

490 :デフォルトの名無しさん:02/04/28 03:53
(゚д゚)ハァ!? それじゃ、一桁ちがうじゃねーか。そんな間違いがあるか。
そんなことだから、超FAQのくだらねーことで悩むんだよ。このバカチンが。

いいか。自動変数は、VC++の場合はスタックに確保され、スタック領域は、デフォルトで1MB。
このばあい、valは約2MBなので「スタック使いすぎだぞ(゚Д゚)ゴルァ!」とWindowsが怒る。
staticにすると、メモリが別の場所で確保されるる。また、静的変数を格納する領域は、
スタックより広い。

491 :悩みつづけて3ヶ月!:02/04/28 03:57
>>489
そうだったんですか・・・!
いやぁ、助かりました。
私は、全くのプログラミング音痴(言語痴)なので!
本当にありがとうございました。
また分からないことがあったら、そのときはまた宜しくお願いします。

492 :デフォルトの名無しさん:02/04/28 04:00
>>490
VC++はデフォルトで1Mバイトですか。Borland-C++も1Mバイトですね。
これらの設定はリンカオプションで指定できますね。

493 :悩みつづけて3ヶ月!:02/04/28 04:14
>>489
ちんぷんかんぷんな質問なのかもしれないのですが、
グローバル領域に確保できる変数領域っていうのはメモリの空き容量だけいけるのですか?
メモリが256MBならば、100MB程度は大丈夫とか!?


494 :デフォルトの名無しさん:02/04/28 04:19
>>493
理論上、2GBまで

495 :デフォルトの名無しさん:02/04/28 04:19
>>493
人に聞く前に自分で試してみろ。
実メモリは関係ない。スワップするだけだ。

496 :デフォルトの名無しさん:02/04/28 04:22
>>493
仮想記憶という言葉をご存じかな?
もちろん実メモリが多ければ多いほど、ディスクスワップの頻度が減る。
フォトレタッチソフトをガンガン使う人がメモリ多く積むのはそのせい。

497 :悩みつづけて3ヶ月!:02/04/28 04:26
>>495
ごもっともです。すみませぬ。

>>496
仮想メモリですよね!?
意味はわからないのですが聞いたことはあります。
スワップというのは、ハードディスクとメモリ間のデータの行き来のことを意味しているんですよね!?

498 :デフォルトの名無しさん:02/04/28 04:29
static領域で256M以上使用しようとすると、
「トータルイメージサイズが最大値 (268435456) を越えています」
とおこられます。

499 :デフォルトの名無しさん:02/04/28 04:31
つかそういった環境依存の話を環境書かずにするなよ。

500 :デフォルトの名無しさん:02/04/28 04:33
環境は485に明記してありますが何か。

501 :悩みつづけて3ヶ月!:02/04/28 04:33
OS:Windows2000 Pro
メモリ:512MB
CPU:Duron 850MHz
ソフト:Visual C++

502 :デフォルトの名無しさん:02/04/28 08:18
>>500
>>498 = >>485 なんてお前にしかわかんないだろうが、バカ。
malloc() 使えや。

503 :デフォルトの名無しさん:02/04/28 09:27
いつだったか、「24MBもスタックに取るのは取りすぎだ。」と言ったら「そんなことない。」と言われた。
相手の環境はどんなものだったんだろ。
私は1MBも取ったら取りすぎだと思うけど。

504 :デフォルトの名無しさん:02/04/28 09:34
>>503
Unix だったら、いいんじゃない ? (自動拡張するからねぇ...。)

505 :デフォルトの名無しさん:02/04/28 09:36
>>503
メモリなんか何百MBも積んでて一部ではGBにも突入している今の時代。
まぁいいんでないかねぇ。

506 :デフォルトの名無しさん:02/04/28 11:20
>>505
可読性や実行速度で問題がなければいいんだろうけど、
自動変数として数十MB使うってのはやっぱり妙な気分がするな。

507 :デフォルトの名無しさん:02/04/28 11:30
RMSはプログラムの使用メモリが1MBを越えるまでは何も考えるな。
1MBを越えるようなら作りを考えろ、と言っていたな。
10年くらい前に。


508 :デフォルトの名無しさん:02/04/28 11:44

>>502
お前の人間部分は失格。

509 :デフォルトの名無しさん:02/04/28 12:19
>>508
まぁまぁ、マターリしようよ。
>>499 も、出来れば >>498 へのポインタつけてほしいな。

510 :デフォルトの名無しさん:02/04/28 12:32
VC++のスタックサイズって足りなくなっても自動拡張しないのですか?

511 :デフォルトの名無しさん:02/04/28 13:04
>>510
リンクする際にスタックサイズは固定されてしまいます。

512 :デフォルトの名無しさん:02/04/28 13:17
>>507
>概して、たった数メガしかメモリを使わないなら、メモリの使用を減らす努力を 行うことに悩まないように。
(GNU coding standard邦訳より)

513 :デフォルトの名無しさん:02/04/28 13:20
>>510
デフォルトでは1MB分のメモリ空間が確保されていて、そこまでは自動的に拡張されます。
1MBを超えられる保証はありませんが、隣接するメモリが空いていれば拡張されます。
デフォルトの確保サイズは変更することができます。

514 :デフォルトの名無しさん:02/04/28 13:50
>>513
それって、
char a[100];
と書いて、a[200] = '\x1a'と書いて、
たまたまa[200]が使われてなかっただけとか言うのと同じ事?

515 :デフォルトの名無しさん:02/04/28 13:53
>>513
> 1MBを超えられる保証はありませんが、隣接するメモリが空いていれば
> 拡張されます。
これほんとか ? 隣接するメモリってなんだ ? とりあえず仮想空間って
言葉を理解してから喋ってくれ。

516 :デフォルトの名無しさん:02/04/28 14:30
>>515
>>513が正しい。仮想空間は1MB確保されていて、最初は確か4KBコミットされてるはず。
コミットができることが保証されるのは最初に確保した1MBまでで、そこから先は
隣接する仮想メモリ空間が *空いていれば* (reserveされていなければ)
伸びる。

517 :デフォルトの名無しさん:02/04/28 15:01
質問いたします。
VB用のDLLをBCCで作ろうとしているのですが、うまくいきません。
「DLL内に関数 "test"がありません。」 てな感じにVBに突っ込まれます。

あちこち巡って見たのだけど、VC向けの方法ばかりで、困ってます。
基本的にVCと同じ手順でやってみたのですけど・・・。

例えば、VBから a, b を受け取って a+b を返す関数をDLLに作る場合、
どう書けばVBから使えるでしょうか?

518 :デフォルトの名無しさん:02/04/28 15:03
ありがちな質問には答えられないなんて
DQN++VCD//#$

519 :デフォルトの名無しさん:02/04/28 15:15
>>517
スレ違いだが、エクスポートするときの名前の問題じゃなかった?

520 :デフォルトの名無しさん:02/04/28 15:23
>>519
同意。
クイックビューアとかmapファイルで確認。
後、stdcallしてないとか。

521 :デフォルトの名無しさん:02/04/28 15:35
>>516
>隣接する仮想メモリ空間が空いていれば
これはMMUの動作を知っている人が見ればおかしな
表現だ。一体どういうことか説明せよ

522 :517:02/04/28 15:36
スレ違いだったか。それはスマソ。

__stdcall を関数名の前につけるのは聞いたことあります。
てか、どこぞでは「WINAPI」と書けとあったのでそう書いてたんですけどね。(同じこと?)

クイックビューア、昔は右クリックしたら出たのに最近見ないな…。

523 :デフォルトの名無しさん:02/04/28 15:51
>>521
たまたま知ってるからって偉そうになるなよ

524 :デフォルトの名無しさん:02/04/28 15:52
>>523
なっちゃったものはしょうがない

525 :デフォルトの名無しさん:02/04/28 15:54
>>523-524
マターリマターリ(;´ー`)

526 :とおりすがり:02/04/28 16:08
>>521
そのスタックを使っているプロセス自身が拡張先のアドレス空間を使ってしまっていることも
あるってことじゃないの?
プロセス内から見えるアドレス空間は仮想メモリ空間とはいわないのか?(教えて偉い人)

527 :デフォルトの名無しさん:02/04/28 16:20
>>526
割り当てられているアドレス空間すべてに
仮想メモリが割り当てられているとは限らない。


528 :デフォルトの名無しさん:02/04/28 16:57
>>526
もちろんアプリケーションから見えるアドレス空間は仮想メモリ空間。

>そのスタックを使っているプロセス自身が拡張先のアドレス空間を
>使ってしまっていることもあるってことじゃないの?
空いている物理アドレスにリニアアドレスを
割り当てるわけだからその意味が分からない。

>>527
??。仮想メモリ空間というのは論理メモリ空間のことだよ

529 :515:02/04/28 18:28
>>516
その情報のソース希望。
Windows は知らないのだが、普通の OS は Heap は上から、Stack は下から
取っていって、ぶつかったら「メモリーがねぇぞ」とかいう風に実装すると思う。
大体今時の 32bit プロセサなら最低 1GB 程度のアドレス空間をプロセスに割り
当てているはず。
で、知りたいのは、「そこから先は隣接する仮想メモリ空間が *空いていない*」
状態ってどういう状態かを教えてくれ。

530 :526ではない:02/04/28 19:03
>>528
ここのリニアアドレスってどういう意味?x86用語でリニアアドレスというのが
あるのは知っているがそれだと話があわない。

>>529
SPARC版SolarisなんかではHeapとStackの間に共有ライブラリの空間を置い
たりするみたいですよ。ソースは『Solaris Internals』P.137。Intel x86版
Solarisはテキストの低位側にスタックを置くようです。なんでこんなふうに
するんだか。。。

531 :デフォルトの名無しさん:02/04/28 19:21
リニアアドレスはページングによるメモリアドレス

532 :デフォルトの名無しさん:02/04/28 19:36
>>531
知ったか厨は、でてくんな。

533 :デフォルトの名無しさん:02/04/28 20:44

C言語の話か?

534 :デフォルトの名無しさん:02/04/28 20:53
>>531
知らない厨は、でてくんな。

535 :デフォルトの名無しさん:02/04/28 20:55
>>532>>534
煽り厨はでてくんな。

536 :デフォルトの名無しさん:02/04/28 21:00
お前らみんな別スレ逝け

537 :ロートル:02/04/28 21:17
>>529
1Gちかくスタック領域のところまでメモリをmalloc等で確保されてんだろうもちろん。
NTだと予約されたページでもアクセスされるまでは物理メモリ割り当てられないから
1G物理メモリなくてもそういう事はできる。


538 :デフォルトの名無しさん:02/04/28 21:22
グリグリ( ´ー`)σ)´д`)←>>536

539 :デフォルトの名無しさん:02/04/28 22:03
SS==DSの時のスタックの飛び込み自殺と、セグメントリミットを越えたメモリアクセスと、
スワップファイルの容量不足を別けて考えられない人のスレッドはここですか?

540 :デフォルトの名無しさん:02/04/28 22:36
>>539
そんなのは明らかに環境依存の話だからです。
漏れのターゲットなんてスタック10KB無ぇよヽ(`Д´)ノウワァァン!!
KB単位で取れるだけ、かなり恵まれてはいるんだが。

541 :515:02/04/28 23:31
>>537
やって見りゃわかると思うけど、malloc() なんか全然つかってなくっても、ス
タックに 1MB 程度取ると、エラーになるんだよね。まあ、printf() とかは
使ってるからヒープの使用量が 0 とは言わないけど、1GB なんてとても考えら
れないよ。
だから、>>516 のソース希望って書いてんのよ。

ちなみに、「予約されたページでもアクセスされるまでは物理メモリ割り当てら
れないから1G物理メモリなくてもそういう事はできる。」って言うのはおかし
い。Over commit について言ってんだろうけど、Over commit してない OS で
も「仮想記憶」をサポートしてたら、そう言うことはできるよ。できないのは、
1G の仮想メモリがない場合だよ。

542 :デフォルトの名無しさん:02/04/29 04:26
>>515=529=541
横からごめん。
>>529で、Windowsは知らんって言ってるけど
VC++って、Windows以外にも対応してるの?

543 :542:02/04/29 04:48
書き忘れてた…
1年弱2chから離れてたから分からないけど
最近では、スレが違っても、あまり気にしないの?
これが最近の流行なら仕方ないが、そうでないなら
続きは、好きな所に行ってやって下さい。

VisualC++相談室
http://pc.2ch.net/test/read.cgi/tech/1017843192/
□□□VC 初心者質問スレ 2□□□
http://pc.2ch.net/test/read.cgi/tech/994129650/
C++相談室 part6
http://pc.2ch.net/test/read.cgi/tech/1018454705/

544 :デフォルトの名無しさん:02/04/29 05:49
>>543
C++相談室は違うだろ


545 :デフォルトの名無しさん:02/04/29 06:09
適切なスレがないねえ。
それより知ったか君がうざい

546 :デフォルトの名無しさん:02/04/29 06:11
仮想メモリ空間が *空いてる* ってどういう意味?
解説キボン

547 :デフォルトの名無しさん:02/04/29 06:11
写真送ったら中元タンに会えるかな?

548 :デフォルトの名無しさん:02/04/29 06:11
誤爆しますた。スマソ

549 :デフォルトの名無しさん:02/04/29 06:19
全てのユーザーメモリ空間を読み書き可能にして、
書き込みアクセスしたら物理ストレージを割り当てればいいと思う

550 :515:02/04/29 07:25
>>542
すまそ。スレ違いは、認識してんだが >>545 が言うように適当なスレなく
て。OS 板かなぁ...。
> VC++って、Windows以外にも対応してるの?
は、知ってて聞いてんだよね ?

>>546
ttp://www.asia.microsoft.com/japan/developer/library/default.asp?URL=/japan/developer/library/jpwinpf/_win32_virtualalloc.htm
あたりを読むと、いいかも...。

>>549
誰に対するレスなの ?

551 :デフォルトの名無しさん:02/04/29 11:50
スタックとヒープ、gccはセグメントの両側から中央に向かって伸びる、
VC++はセグメントの中央から両端に向かって伸びる。


552 :デフォルトの名無しさん:02/04/29 12:23
while(fgets(line_buf, sizeof line_buf, stdin) != NULL){
・・・・・・・・・
}
このwhile文から抜け出すには、\nを実行中に入力すればいいんですよね?
でも、いくら\nと入力しても抜けれません

553 :デフォルトの名無しさん:02/04/29 12:26
>>552
「\」「n」 と入力するんではなくて、\n は改行のことなので、エンターキーを押せばいいのじゃ。
・・・ネタ?

554 :553:02/04/29 12:28
>>552
書いてから気付いたけど、それって \n までじゃなくて、ファイルの終わりまで繰り返すんじゃない?


555 :デフォルトの名無しさん:02/04/29 12:29
エンターキー押してもだめでした。
ネタではありません 助けて

556 :552:02/04/29 12:35
>>554
ファイルの終わりって どのファイルの終わりまでなのでしょうか?
fgetsはどうやったらnullと返してくれるのですか?

557 :デフォルトの名無しさん:02/04/29 12:39

>>552
fgets は改行の後に'\0'を入れて、文字列にします。

$ abc[return]

と入力すると、バッファーには
'a','b','c','\n','\0'
と格納される。

だから >>552 だと、入力がある限りいつまでたっても抜けられない。
抜けるには プロンプトから EOF 打ち込むか、
while ループの中で何か条件つけるとかしないと。

>>553
面白くない。

558 :デフォルトの名無しさん:02/04/29 12:39
>>556
stdinが指すファイルの終わり(EOF)を検知したとき。
stdinが標準入力だとすると、EOFは検知することはないような気が・・・・・

559 :558:02/04/29 12:40
>>556
あ、、、EOFを入力すればいいのか・・

560 :デフォルトの名無しさん:02/04/29 12:44
>>552
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/fgets.3.html

fgets()の仕様。よく読んでおいて。

561 :デフォルトの名無しさん:02/04/29 12:44
>>556
DOSなら CTRL+Z
UNIXなら CTRL+D
でEOFのような気がするけど、試してない。すまん。

562 :522:02/04/29 12:46
有難うございました
なにか条件をつけてループを抜ける事にします

563 :デフォルトの名無しさん:02/04/29 13:03
だからCTRL+Zだっつーの


564 :522:02/04/29 13:05
>>563
visualC++を使っているのですがCTRL+Zだとプログラムそのものが
終わってしまいます

565 :デフォルトの名無しさん:02/04/29 13:07
>>564
んなこたーない。

566 :デフォルトの名無しさん:02/04/29 13:47

Linux で kterm 使ってますが、EOF は ctrl-d です。

>>563 >>565
何使ってますか?

567 :デフォルトの名無しさん:02/04/29 13:55
>>566
MS-DOS系統のOSは(Winも含めて) EOF は ctrl-z です。
ちなみにNT

568 :566:02/04/29 14:05

勘違いしました。
>>563 >>565 が EOF がわからないって言う話ではないのね。ゴメン。

>>522
fputs 等でコンソール上に出力するだけだったら、
EOF の入力と同時にプログラムが終了する場合もあります。

いっそのことソースコード出してみては?

569 :デフォルトの名無しさん:02/04/29 14:23
ちょっと読み返して気付いた。
>>522 よ、お前は >>552 ではないのか・・・?

570 :Not 564:02/04/29 14:29
>>565
^Cで強制終了させたかのように終わるって(笑)

571 :デフォルトの名無しさん:02/04/29 14:44
szstr = (char *)malloc()
がある関数の中だけ、例外と違反のエラーを
かえすんだけど、その原因はなんだったっけ?

前にも一回あって解決したんですけど忘れてしまいました。

szstr = のところに原因はないっす。
とりあえずszstr = とりのぞいてもエラーはでるっす。

static とか関係あったんだっけかな・・・・

572 :デフォルトの名無しさん:02/04/29 14:47
>>571
mallocの引数は?

573 :デフォルトの名無しさん:02/04/29 14:50
引数に具体的な数字、256とか入れても
だめだったよ。

574 :デフォルトの名無しさん:02/04/29 14:51
>>573
とある関数って言われてもわからない。

575 :デフォルトの名無しさん:02/04/29 14:58
WINAPIなんだけど、ダイアログプロシージャ
の中で自作関数GetAHref(){
lpszlist = szlist;(ポインタのポインタ)
....
*lpszlist = (char *)malloc(nlen +1);
lpszlist ++;
}
を呼んでる。
わけわかんないからとえあえず
char **szlist;
をグローバルで宣言。

576 :デフォルトの名無しさん:02/04/29 15:00
>>575
szlistはmallocなどで初期化されているよね?

577 :デフォルトの名無しさん:02/04/29 15:02
されてる。ZeroMemoryもした。
(というか、"*lpszlist = "の部分抜かしても
やっぱりmalloc関数自体エラー返すから。)

578 :デフォルトの名無しさん:02/04/29 15:03
>>577
どういう風に初期化したの?
そこだけコードをみせてくれない?

579 :578:02/04/29 15:07
ん?mallocがエラーを返すってNULLを返すってこと?
それは単にメモリーの確保に失敗しただけなんじゃ・・・・

580 :デフォルトの名無しさん:02/04/29 15:09
char **szlist;(ぐるーばる)
.......
case WM_INITDIALOG:

szlist = (char **)malloc(256);
ZeroMemory(szlist,256 * sizeof(char **) );
..........

case FD_CLOSE:
GetAHref();(szlistはグローバルだからここでは引数として与えてない)
break;

・・・・まずいかな。

581 :デフォルトの名無しさん:02/04/29 15:10
>>579
NULLを返すんじゃないんだよ。
NULLさえ返さず失敗してページ違反エラー返すの。
MessageBox();でチェックしたから。

582 :デフォルトの名無しさん:02/04/29 15:11
>>580
あ、やっぱり・・・・
szlist=(char **)malloc(sizeof(char **)*256);
こうでしょ。
ポインターひとつが1バイトだとは思えないし。

多分ZeroMemory()でアクセス違反が起きているはず。

583 :デフォルトの名無しさん:02/04/29 15:14
>>582
結局同じ事だけど正確にはこうじゃないの?
szlist = (char **)malloc(sizeof(char *) * 256);


584 :デフォルトの名無しさん:02/04/29 15:17
あーーーーーーーーーー
生きてるってなんですかーーーーーーーああ
>582
もうこれだからやだよ・・・・・
static とか未だによくわかってないから
自信なくて自分で答え出せないんだよな
・・・
さんきゅー。
(ZeroMemory()のとこでは明示的にアクセス違反が
表示されないのが味噌だよな・・・)



585 :デフォルトの名無しさん:02/04/29 15:18
>>583
あ、、、

586 :デフォルトの名無しさん:02/04/29 15:19
>>584
staticとかじゃなくて単に確保したメモリーの量が少なかっただけ。
charは1byteだから普通はsizeof〜は書かないけど。

587 :デフォルトの名無しさん:02/04/29 15:20
ポインタへのポインタ型が、ポインタ型と同じサイズである保証はないね。
まあ、ヘタレのいじれる環境では、結局おなじことだけど。


588 :デフォルトの名無しさん:02/04/29 15:21
>585
俺もあ、と思ってもどってきた。


589 :デフォルトの名無しさん:02/04/29 15:23
>>587
はぁ?
何を指そうがポインタはポインタだろ。
だからこそvoid *なんてものが実現するわけだし。

590 :デフォルトの名無しさん:02/04/29 15:25
>>587
勉強不足だな。
ポインタはある特定のアドレスを指し示す変数だから、
ポインタへのポインタもポインタだよ。

591 :デフォルトの名無しさん:02/04/29 15:26
やめろよばーろー
私のために喧嘩しないで☆

592 :デフォルトの名無しさん:02/04/29 15:28
ポインタはポインタでも、
大きさが違うことはあり得るよ。
DOSのプログラムとか。

まあ、この場合はたぶん大丈夫だろうが。

593 :デフォルトの名無しさん:02/04/29 15:33
まー、>>589-590は一生32bit環境だけつかってなさいってこった

594 :デフォルトの名無しさん:02/04/29 15:33
まぁそれを考えるなら、
一次配列の方が使用頻度が高いから
sizeof(char **)<sixeof(char *)
だろうね。
char **はそんなつかわないから
大きい数字必要ないっしょ。
(591)



595 :デフォルトの名無しさん:02/04/29 15:34
>>593
bit数がどう関係あるんだ?

596 :デフォルトの名無しさん:02/04/29 15:35
よけいなつっこみをされたくなけりゃ、厳密に型を指定しろってことだね。


597 :デフォルトの名無しさん:02/04/29 15:37
あのさ、あらゆるシステムでポインタのサイズが同じだと言っているんじゃないぞ。
同じシステムではポインタのサイズは何を指そうが同じだと言っているんだよ。

598 :デフォルトの名無しさん:02/04/29 15:37
>>595
一般的な32bit環境のコンパイラはすべてのポインタが32bit=4byteだから。
それ以外の環境は見たこと無い。
64bit環境だと32/64bitポインタ混在だったりする。
gccのvoid*型が64bitで、型へのポインタが32bitだったり

599 :デフォルトの名無しさん:02/04/29 15:39
>>598
なんのメリットがあるの?

600 :デフォルトの名無しさん:02/04/29 15:39
>>599
俺に聞くな

601 :デフォルトの名無しさん:02/04/29 15:41
>>600
まあそうだけど。。。

わけわからん・・・・void *なら指せても、char *なら指せない領域ができるってことだよね?

602 :デフォルトの名無しさん:02/04/29 15:43
http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=utf8&oe=utf8&q=void%2A+64bit+%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF

http://www2.airnet.ne.jp/pak04955/ramble-199912.htm
>ポインタ変数の大きさはintの大きさと同じではない。現状sizeof(int) = 4, sizeof(void*) = 4の環境が多いが,64bit環境ではsizeof(int) = 4, sizeof(void*) = 8となる場合がある。

603 :デフォルトの名無しさん:02/04/29 15:44
>>602
誰もそんなこと言っていないぞ。誤爆?

604 :デフォルトの名無しさん:02/04/29 15:46
コメント入れた方がよかったか?
一番上の条件でググって、上から3番目の貼り付けたリンクに、
引用部分の記述があるぞ

605 :デフォルトの名無しさん:02/04/29 15:48
>>604
そういう意味じゃなくて、
このスレの誰もがそんなこと言っていないと言ったの。

606 :デフォルトの名無しさん:02/04/29 15:58
#include <stdio.h>

int main(void){

printf("sizeof(char *): %d\n", sizeof(char *));
printf("sizeof(int *): %d\n", sizeof(int *));
printf("sizeof(float *): %d\n", sizeof(float *));
printf("sizeof(double *): %d\n", sizeof(double *));
printf("sizeof(void *): %d\n", sizeof(void *));

printf("sizeof(char **): %d\n", sizeof(char **));
printf("sizeof(int **): %d\n", sizeof(int **));
printf("sizeof(float **): %d\n", sizeof(float **));
printf("sizeof(double **): %d\n", sizeof(double **));
printf("sizeof(void **): %d\n", sizeof(void **));

printf("sizeof(char ***): %d\n", sizeof(char ***));
printf("sizeof(int ***): %d\n", sizeof(int ***));
printf("sizeof(float ***): %d\n", sizeof(float ***));
printf("sizeof(double ***): %d\n", sizeof(double ***));
printf("sizeof(void ***): %d\n", sizeof(void ***));

.
.
.

return 0;
}

607 :デフォルトの名無しさん:02/04/29 16:01
>>606
どうでもいいが%uにすべき。

608 :デフォルトの名無しさん:02/04/29 17:27
#include<stdio.h>
void main (void)
{
double lex,let,rix,rit,x,tei,answer;
printf("左辺のxの係数を入力して下さい\n");
scanf("%d",&lex);
printf("左辺の定数を入力して下さい\n");
scanf("%d",&let);
printf("右辺のxの係数を入力して下さい\n");
scanf("%d",&rix);
printf("右辺の定数を入力して下さい\n");
scanf("%d",&rit);
x=lex-rix;
tei=rit-let;
answer=tei/x;
printf("方程式の解 x=%.2f\n",answer);
  }

これコンパイルするとエラーがでるんです。
超初心者なのでなにも分かりません。
どこが間違ってるのかおしえてください。



609 :デフォルトの名無しさん:02/04/29 17:29
ポインタのポインタ型とポインタ型が同じ大きさである保証は無いが
普通は同じでしょう?

610 :デフォルトの名無しさん:02/04/29 17:30
>>608
%dは整数型のみ。
double型なら%lf
float型なら%f

611 :610:02/04/29 17:31
scanfの場合な。

612 :デフォルトの名無しさん:02/04/29 17:31
>>608
だからそのエラーを書けよ。
たとえコンパイルできても%dはやめといたほうがいいぞ。

613 :デフォルトの名無しさん:02/04/29 17:32
>>608 まず%dは整数ですよん
doubleならlfだったキブーン

614 :デフォルトの名無しさん:02/04/29 17:34
#include<stdio.h>
void main (void)
{
int lex,let,rix,rit,x,tei,answer;
printf("左辺のxの係数を入力して下さい\n");
scanf("%d",&lex);
printf("左辺の定数を入力して下さい\n");
scanf("%d",&let);
printf("右辺のxの係数を入力して下さい\n");
scanf("%d",&rix);
printf("右辺の定数を入力して下さい\n");
scanf("%d",&rit);
x=lex-rix;
tei=rit-let;
answer=tei/x;
printf("方程式の解 x=%d\n",answer);
  }

このように最初の宣言をdoubleからintに変更したのですが

COMMAND.COM /C BCC32.EXE 一次方程式の解.c
*** コンパイル開始 ***
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
一次方程式の解.c:
エラー E2206 一次方程式の解.c 17: 不正な文字 ' ' (0x8140)(関数 main )
*** 1 errors in Compile ***
*** コンパイル終了 ***

となってしまいます…

615 :デフォルトの名無しさん:02/04/29 17:35
>>614
全角スペースを入れていないか?

616 :デフォルトの名無しさん:02/04/29 17:35
>>614
そりゃ、全角のスペースが17行目に入ってる罠。

617 :デフォルトの名無しさん:02/04/29 17:35
>>614
まさかとは思うが、その最後の } の前の全角スペースは、
コピーミスじゃなくて、オリジナルにもついてるのか?

618 :615:02/04/29 17:36
それと、ファイル名に全角文字は使わない方がいいよ。

619 :デフォルトの名無しさん:02/04/29 17:36
>>615
その可能性はあります。
探してみます

620 :デフォルトの名無しさん:02/04/29 17:36
>>614
最後の } の前に全角空白はいってるのが駄目。
コメント以外で全角文字つかっちゃ駄目だよ。

621 :デフォルトの名無しさん:02/04/29 17:36
前からそうだったが、このスレは親切だな・・・。

622 :デフォルトの名無しさん:02/04/29 17:36
>>620
文字列定数ならOK

623 :デフォルトの名無しさん:02/04/29 17:37
みなさん、ありがとうございました。おっしゃるとおり全角スペースが入ってました。
次からは気をつけます。

624 :デフォルトの名無しさん:02/04/29 17:37
>>614
思いっきり全角スペースが一番最後に入ってるやんけ
C/C++は全角文字は入れちゃだめなのよ、文字列とコメント以外はね

625 :デフォルトの名無しさん:02/04/29 17:38
>>622
スマソ。ころっと忘れてた(w

626 :624:02/04/29 17:39
さすが、ダイヤルアップ&テレホしか入ってないから遅れたな(゚Д゚)

627 : :02/04/29 17:48
遅レスだがポインタの大きさが参照先の型毎に同じか違うかは機種依存みたいすね
結論は 609 さんが正しい気がする

http://www.catnet.ne.jp/kouno/c_faq/c5.html#17


628 :デフォルトの名無しさん:02/04/29 18:06
#include<stdio.h>
void main (void)
{
float lex,let,rix,rit,x,tei,answer;
printf("左辺のxの係数を入力して下さい\n");
scanf("%f",&lex);
printf("左辺の定数を入力して下さい\n");
scanf("%f",&let);
printf("右辺のxの係数を入力して下さい\n");
scanf("%f",&rix);
printf("右辺の定数を入力して下さい\n");
scanf("%f",&rit);
if(lex!=rix)
{
x=lex-rix;
tei=rit-let;
answer=tei/x;
printf("方程式の解 x=%.2f\n",answer);
}
else if(let==rit)
{
printf("解は全ての実数\n");
}
else
{
printf("解なし\n");
}
printf("終了します。Enter キーを押してください。");
rewind(stdin);
getchar();
return 0;
}

整数から実数に拡張するためintをfloat、%dを%fに変更したのですが
どんな数値を入れても解が0.00になってしまいます…
何がおかしいのでしょうか?

629 :デフォルトの名無しさん:02/04/29 18:06
ポインタのポインタ型はポインタ型だろう?

630 :デフォルトの名無しさん:02/04/29 18:08
>>628
実数の場合は==や!=で同じかどうか判断するのはやめた方がいいみたい。
もっとも、この問題には関係ないけど。

631 :デフォルトの名無しさん:02/04/29 18:08
>>628
そういうの作るときはさ、
入力受け付けた後にその値を一度出力してみるんだよ。

632 :デフォルトの名無しさん:02/04/29 18:08
>>629
そうだけど、指し示すものによって大きさを変えるひねくれた環境もあるんだってさ。

633 :デフォルトの名無しさん:02/04/29 18:10
教えて君に親切にありがとうございます。
>>631で言われたとおりにやってみます。

634 :デフォルトの名無しさん:02/04/29 18:10
>>629
そうだよ。
だけど、アドレス幅は型に依存する。

635 :デフォルトの名無しさん:02/04/29 18:16
>>628
%fでなくて、%lf。

636 :デフォルトの名無しさん:02/04/29 18:19
>>635
floatなら%fだよ。
%lfはdouble

637 :デフォルトの名無しさん:02/04/29 18:20
>>635
floatだから%fでいいんでない?

638 :デフォルトの名無しさん:02/04/29 18:20
#include<stdio.h>
void main (void)
{
float lex,let,rix,rit,x,tei,answer;
printf("左辺のxの係数を入力して下さい\n");
scanf("%f",&lex);
printf("左辺の定数を入力して下さい\n");
scanf("%f",&let);
printf("右辺のxの係数を入力して下さい\n");
scanf("%f",&rix);
printf("右辺の定数を入力して下さい\n");
scanf("%f",&rit);
/* printf(" %f %f %f %f\n",lex,rix,let,rit);*/
if(lex!=rix)
{
x=lex-rix;
tei=rit-let;
answer=tei/x;
printf("方程式の解 x=%.2f\n",answer);
}
else if(let==rit)
{
printf("解は全ての実数\n");
}
else
{
printf("解なし\n");
}
printf("終了します。Enter キーを押してください。");
rewind(stdin);
getchar();
return 0;
}


>> printf(" %f %f %f %f\n",lex,rix,let,rit);
この行を追加したらなぜか上手くいったので
コメントにしてみたらやっぱり上手くいきました。
こんなことってあるのでしょうか

639 :デフォルトの名無しさん:02/04/29 18:26
>>638
コンパイル忘れて古いファイルを実行してたとかね。
無いことは無い。

640 :デフォルトの名無しさん:02/04/29 18:26
>>638
そういえばなんでrewind(stdin)しているの?

641 : :02/04/29 18:27
それよか
void mainなのに return 0; するとコンパイラがワーニングはくと
思うんだけど、なんで無視すんのよ。


642 :デフォルトの名無しさん:02/04/29 18:28
>>640
作成されたexeファイルをダブルクリックで実行すると処理が終わった瞬間ウィンドウが
閉じてしまうのでそれを防ぐために入れています。
>>639
僕がうっかりしていたという以外の理由はないのでしょうか?

643 :640:02/04/29 18:30
>>642
それはgetchar()でしょ?rewindはいらない。    

644 : :02/04/29 18:34
getchar()一個だけだと最後のscanfの改行が残ってて、
ウィンドウ閉じそうに見えるけど。違うかな?



645 :デフォルトの名無しさん:02/04/29 18:50
すみません、飯食ってました。
ホームページで「意味が分からないならとりあえずそのまま書き込んでおけ」
というような感じだったのでそのままコピペした部分もあります。
だからどういう意味なのか良く分からないという部分が結構あるのです。

646 :デフォルトの名無しさん:02/04/29 20:32
>>645
そのホームページはどこ?

と、祭を誘ってみるテスト。

647 :デフォルトの名無しさん:02/04/29 21:29
晒せ!晒せ!晒せ!

648 :デフォルトの名無しさん:02/04/29 21:39
>>634
C99ではそうなったのか?C89ではそんなことないぞ。
C89ではアライメント制限以外に制限無し。char*, void*に入れて戻せないポイ
ンタは無い。ただし関数へのポインタを除く。

649 :教えて君です:02/04/29 21:44
あの〜Cのコンパイラ欲しいんですけど、
win2000でも動くやつでいいやつどなたか知りませんか?
98SEをゲストOSで使うの飽きちゃって、
どなたか教えてください。

650 :デフォルトの名無しさん:02/04/29 21:47
>>649
http://www.borland.co.jp/cppbuilder/freecompiler/

FAQ だぞ。

651 :デフォルトの名無しさん:02/04/29 21:47
>>649
OS関係あるのか?
とりあえず Borland C++ Compilerがフリーだからそれでも使っとけ。

652 :教えて君です:02/04/29 21:50
>>650
FAQってふぁっきゅーって読むんですか?
>>651
visual C++ 6.0 動かないんですよ〜2000だと(涙

653 :デフォルトの名無しさん:02/04/29 21:52
>>652
どちらかというと2000などのNT系でよく使われているぞ。
つまり仕事でな。


654 :デフォルトの名無しさん:02/04/29 21:53
>>652
それはWin2kの所為じゃなくて、あんたの環境の所為

655 :デフォルトの名無しさん:02/04/29 21:54
>>652
お願いだからそんな恥づかしい読み方しないでくださいw
エフエーキューって俺は読んでるけど…

俺は2000でVC6動いてるよ。SP5にした?
OS再インストール…ってわけにはいかないかねw

656 :デフォルトの名無しさん:02/04/29 21:55
ファッキューが普通じゃねぇ?

657 :デフォルトの名無しさん:02/04/29 21:56
if(mona == YES){
monadazo(eyei);
}
else{
monajyanee(utudazo);
}
ahya -> BltFast(0,0,---,---,DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);

if(mona == YES) monadazo(eyei);
else monajyanee(utudazo);
ahya -> BltFast(0,0,---,---,DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);
どちらが可読性がありますか?

658 :デフォルトの名無しさん:02/04/29 21:56
>>656
俺もそう読んでいる。

659 :デフォルトの名無しさん:02/04/29 21:57
>>657
改行しているから上

660 :デフォルトの名無しさん:02/04/29 21:58
>>656>>658
ガーン…
大学の研究室に女の子いるから絶対そんな風には言えん…

>>657
tabが反映されなくてどちらも読みづらい罠

661 :デフォルトの名無しさん:02/04/29 21:58
>>657
if と { が同じ行だから上も駄目。

662 :デフォルトの名無しさん:02/04/29 21:59
>>657
今は前者を推奨しているケースが大多数

663 :デフォルトの名無しさん:02/04/29 21:59
>>660
女の子もファッキューと読んでいます。

664 :デフォルトの名無しさん:02/04/29 22:00
>>661
関数以外は同じ行でないと読みにくい。  

665 :デフォルトの名無しさん:02/04/29 22:01
>>657
オレもふぁっきゅー上。

666 :デフォルトの名無しさん:02/04/29 22:01
これ以上は戦争になるからやめよう。

667 :デフォルトの名無しさん:02/04/29 22:03
>>661
俺的それは無い。
if
}
while
}
switch
}
てな感じじゃないと嫌。

668 :デフォルトの名無しさん:02/04/29 22:07
>>659-667
サンクス
これから会社行って直してくる

669 :デフォルトの名無しさん:02/04/29 22:07
漏れならこう書く。

if(mona== YES) {
  monadazo(eyei);
} else {
  monajyanee(utudazo);
}

ahya->BltFast(0,0,---,---,
       DDBLTFAST_SRCCOLORKEY| DDBLTFAST_WAIT
       );


670 :教えて君です:02/04/29 22:12
SP5ってNTじゃないんですか?

671 :デフォルトの名無しさん:02/04/29 22:15
ifの書き方は669に一票。

>>670
だね。2000はSP2までだと思う。
あとVC++のSPも当てておくのが吉かと。

672 :デフォルトの名無しさん:02/04/29 22:16
>>670-671
VC++6.0のことだろ(ワラ

673 ::02/04/29 22:16
このプログラムをコンパイルしようとすると
”関数は値を返すべき”
というエラーがでます。

どっかおかしいでしょうか?

#include <stdio.h>

/*fahr = 0,20,40・・・・・・・300に対して、摂氏ー華氏対応表を印字*/

main()
{
int fahr, celsius;
int lower, upper, step;

lower = 0; /* 温度表の下限 */
upper = 300; /* 上限 */
step = 20; /* 刻み */

fahr = lower;
while (fahr <= upper) {
celsius = 5 * (fahr - 32) / 9;
printf ("%d\t %d\n",fahr,celsius);
fahr = fahr + step;
}}


674 :デフォルトの名無しさん:02/04/29 22:17
mainの型が省略されたらintが入るんで無かったっけ?

675 :デフォルトの名無しさん:02/04/29 22:18
>>673
main関数の戻り値の型が省略されているからint型の値を返すべき。

676 :デフォルトの名無しさん:02/04/29 22:18
>>673
返り血を明示的に指定しない関数はint型とみなされます。
基本だろ…。

677 :デフォルトの名無しさん:02/04/29 22:18
>>673の最後の
}}
がすげーやだ。

678 ::02/04/29 22:23
すみません、main関数、intの値を返す
ってのが良く意味分からないんですが・・・・・・・・・

679 :デフォルトの名無しさん:02/04/29 22:24
>>673
警告とエラーの区別くらいはつけような。


680 :デフォルトの名無しさん:02/04/29 22:26
>>678
main()の中の好きな場所にreturn 0;とでも書く。

681 :デフォルトの名無しさん:02/04/29 22:26
>>678

char func()はchar型を返すでしょ?
この型を省略して、func()と書くと戻り値の型がint型とみなされて、必ずint型の値を返さなければならなくなるの。
戻り値を持たないのならvoid func()とかく。

とりあえず最後の行にreturn 0;と書いておけ。

682 :デフォルトの名無しさん:02/04/29 22:26
>>678
勉強不足。
本読んで意味がわかるようになってから質問してください。

683 :教えて君です:02/04/29 22:27
>>672
意味がわかりました!!
恥ずかしいので
憤死します!!

684 ::02/04/29 22:27
どうもありがとうございました

685 :デフォルトの名無しさん:02/04/29 22:27
>>680
鬼だ・・・
>>681
}}になってるから、最後の行に書いても悲惨なことに・・・

686 :デフォルトの名無しさん:02/04/29 22:29
>>673
それK&Rの11ページだろ
明日本屋逝ってもっと薄いCの入門書買ってこい


687 ::02/04/29 22:30
プログラミング言語Cのサンプルプログラム
をそのまま写したのですが、駄目なんですね。

688 :デフォルトの名無しさん:02/04/29 22:31
K&RはANSI準拠じゃないから時代に合わない。

689 :デフォルトの名無しさん:02/04/29 22:32
>>687
あー、本当にreturnがないねぇ・・・・・

690 :デフォルトの名無しさん:02/04/29 22:33
>>688
第二版はANSI準拠だが・・・・

691 :デフォルトの名無しさん:02/04/29 22:33
K&R駄目なのかよ・・・
やけに日下部が進めるから今度買おうと思ったのに・・・

692 :デフォルトの名無しさん:02/04/29 22:35
後ろの方ではきちんとreturnしているな。
たとえば166ページ。

693 :デフォルトの名無しさん:02/04/29 22:36
>>690
そうなのか。じゃあ>>673が持ってるK&Rは年代物なんだな。

694 :デフォルトの名無しさん:02/04/29 22:37
>>693
第二版だけどはじめの方に載っているサンプルはreturn 0していなくて、後の方に載っているサンプルはしている。

695 :デフォルトの名無しさん:02/04/29 22:37
>>691
辞書として一冊はもってたほうがいい。
ただ、K&Rだけで勉強しようとするとつらいので、
K&Rオンリーってのはお薦めできない。

696 :デフォルトの名無しさん:02/04/29 22:40
>>695
いえてる。
私は他の本で勉強した後に間違って覚えたことや無駄なことを直すためにK&Rを読んだ。

697 :デフォルトの名無しさん:02/04/29 22:42
辞書と言うには正確性が...

言語の開発者の思想書だと思って、
書き方のスタイルとか、標準ライブラリの実装法とか、
そういう「ココロ」を汲みながら読むのが正しいだろう。

K&Rの例題くらいはきちんとやっておけよ。
別売りの本まで買って答え合わせする必要はないが。



698 :686:02/04/29 22:45
>>691
おっと、スレ違いになるからこれ以上書かないけど
K&Rが悪いんじゃないぞ
あまりに >>673 が勉強しなさ過ぎるから書いただけだぞ。

「main関数ってナニ」って状態でいきなり2chに聞くなゴルァ
ってこった。

699 :デフォルトの名無しさん:02/04/29 22:49
僕ならvoidつけちゃうな〜
って遅いか(w

700 :691:02/04/29 22:49
思いがけないレス、サンクス。
第2版が最新だよね(1のリンク先より)。
なぜ『ホーキング、未来を語る』と”あわせて買いたい”のかは謎だが・・・
いや実際読みたいけどさ、ホーキング。

701 :デフォルトの名無しさん:02/04/29 22:50
おまえには聞いていない>>686

702 :デフォルトの名無しさん:02/04/29 22:51
まっさらな素人がK&Rで入門しようとすると例題のどれかで挫折する可能性極大

703 :デフォルトの名無しさん:02/04/29 22:55
でも、昔のCってマニアックで楽しかたーね。
省略は int アドレスも int 。
{も1文なら省略って、暗号みたいだた。

704 :デフォルトの名無しさん:02/04/29 23:19
3重くらいのforループの一番深いところから一気に抜けるには
gotoを使えばいいんでしょうか?
本来ならそういうループ構造にしないのが一番いいんでしょうけど(−−;

705 :デフォルトの名無しさん:02/04/29 23:21
>>704
質問はageで。

gotoかフラグ変数で。

706 :705:02/04/29 23:21
一気にというならgotoのみだな。

707 :デフォルトの名無しさん:02/04/29 23:22
試しにどんなループだか書いてみ?


708 :デフォルトの名無しさん:02/04/29 23:22
704
return

709 :デフォルトの名無しさん:02/04/29 23:23
>>708
ちょっと待て(笑)

710 : :02/04/29 23:27
>>648
void* から任意へのポインタへの型変換とその逆は保証されてるっていうのは
アドレス幅が違う場合は処理系がうまく動くように補正してくれるよって
ことで、幅が同じじゃなきゃいけないとかは保証されてないと思うよ。
つまりunsinged longとかでポインタをキャストして無理矢理計算するみたいなやりかたはダメなはず
でも漏れは厨房なのでアライメント制限の意味がわかりません。


711 :デフォルトの名無しさん:02/04/29 23:31
あらゆるポインタはvoid*と相互変換出来るけど、
それ以外の型は規定されていないというだけじゃないか?


712 :デフォルトの名無しさん:02/04/29 23:31
すいません。
Cのソースファイルを
コマンドプロンプトで
コンパイルして実行しようとすると、
ファイルを開くアプリケーションの選択
っていうウィンドウが出てくるんですけど、
どうしたら上手く実行できるのでしょうか。
ちなみにコンパイラはボーランドのフリーのコンパイラを使っています。




713 :デフォルトの名無しさん:02/04/29 23:35
>>712
そんなはずはないよ。
そのコンパイラが出力するファイルは*.exeのはずだからそのまま実行できるはず。

714 :デフォルトの名無しさん:02/04/29 23:35
ポインタの変換については、
とりあえず、K&Rの242ページから読んでみろ。

715 :デフォルトの名無しさん:02/04/29 23:36
>>712
ム板で質問する以前の問題だな。どっか初心者板逝け。

716 :デフォルトの名無しさん:02/04/29 23:41
#include<stdio.h>
#include<stdlib.h>
void main(main)
{
int s,i,x,s1=0,s2=0,s3=0,s4=0,s5=0,s6=0;
float d1,d2,d3,d4,d5,d6;
printf("サイコロを振る回数を決めてください。\n");
scanf("%d",&s);
for(i=1;i<=s;i++)
{
x=(int)(6*(rand()/32767.1)+1);
printf("%d ",x);
switch(x){
case 1:s1++;break;
case 2:s2++;break;
case 3:s3++;break;
case 4:s4++;break;
case 5:s5++;break;
case 6:s6++;break;
}
}
printf("\n");
printf("%d回振った結果1は%d回、2は%d回、3は%d回、4は%d回、5は%d回、6は%d回出ました。\n",s,s1,s2,s3,s4,s5,s6);
d1=(float)(s1*10000/s);
d2=(float)(s2*10000/s);
d3=(float)(s3*10000/s);
d4=(float)(s4*10000/s);
d5=(float)(s5*10000/s);
d6=(float)(s6*10000/s);
d1=d1/100;
d2=d2/100;
d3=d3/100;
d4=d4/100;
d5=d5/100;
d6=d6/100;
printf("1は%.2f%2は%.2f%3は%.2f%4は%.2f%5は%.2f%6は%.2f%です。\n",d1,d2,d3,d4,d5,d6);
printf("終了します。Enter キーを押してください。");
rewind(stdin);
getchar();
return 0;
}

このようなプログラムを書いて実行してサイコロを500000回振ったのですが
2回とも同じ結果になりました。
毎回違った結果が出るようにするにはどうすればいいのでしょうか?

717 :デフォルトの名無しさん:02/04/29 23:42
srand(time(0));

718 :デフォルトの名無しさん:02/04/29 23:47
>>717の方は僕に答えてくれたんですよね?

x=(int)(6*(rand()/32767.1)+1);

x=(int)(6*(srand(time(0))/32767.1)+1);
にしたのですがエラーがでてしまいます。


719 :デフォルトの名無しさん:02/04/29 23:48
>>718
お前は使ってる関数がどんな機能なのか調べもせずにプログラム書くのかよ。

720 :デフォルトの名無しさん:02/04/29 23:49
>>19
すみません、昨日プログラミング始めたばかりなので全然わからないんです。


721 : :02/04/29 23:50
>>718
面白い


722 :デフォルトの名無しさん:02/04/29 23:50
>>718
srand()は値を返さんぞ。

723 :デフォルトの名無しさん:02/04/29 23:51
>>718
srand()
rand()
time()
これらの関数が何をするのか解ってる?
単に言われたことをコピペするだけじゃ成長しないよ。

724 :デフォルトの名無しさん:02/04/29 23:53
天然はオモロイね

725 :デフォルトの名無しさん:02/04/29 23:53
>>723
おっしゃるとおりです。rand以外あるいはそれすら全然意味が分かりません。
しかし調べても書いてあるころがさっぱり理解できないのです。

726 :デフォルトの名無しさん:02/04/29 23:53
>>720
それは719で指摘されたことに対する言い訳にもならない。
ちゃんとどんな機能か調べてから書け。
もしシステムを破壊するような命令だったらどうするんだ?

727 :デフォルトの名無しさん:02/04/29 23:54
>>725
理解できるようになってから質問してください。

728 :デフォルトの名無しさん:02/04/29 23:54
>>726
言えてる、特にここは2chだし。

729 :デフォルトの名無しさん:02/04/29 23:56
俺、常識ないんですけど、htmlからURL引っこ抜くときって
どうします?strstr(szbuf,"http://")
ここらあたりは常識っぽいんですけど、あと、は、そこから、
「.」と「/」と、空白および記号を意識しつつIsCharAlphaNumeric
とか使うのは常識ですか?

730 :デフォルトの名無しさん:02/04/29 23:57
CreateFile関数の第一引数のファイルを指定する所で,
フォルダの中に入っているファイルを参照させたいのですがうまく行きません。
"data/Data.dat"や,"data\PlayerData.dat"ではないようです。
CreateFile(ここ,-,-,-,-,-,・・・);


731 :デフォルトの名無しさん:02/04/29 23:58
>>729
IsCharAlphaNumeric ってWin32API…だよな?

732 :デフォルトの名無しさん:02/04/29 23:58
>>729
RFCにURIに使える文字が定義されてる。

733 :デフォルトの名無しさん:02/04/29 23:58
>>725
http://pc.2ch.net/prog/kako/1000/10005/1000542653.html
このスレを参考にして良さそうな入門書を明日買ってくること。
そして最初から最後まで読破するように。

734 :デフォルトの名無しさん:02/04/30 00:01
どうもありがとうございました。
求めていた答えは得られなかったけど
それ以外のこといろいろ得ることができました。
もっと本読んで勉強します。

735 :デフォルトの名無しさん:02/04/30 00:05
>>734==725?
srandくらいググればいっぱいヒットするんじゃない?
srandって名前が得られただけでもだいぶいい収穫だと思うよ。

736 :デフォルトの名無しさん:02/04/30 00:05
標準ライブラリにmemmoveってあるじゃないですか
あれのK&Rにあるオーバラップしても動くってどんなことをしても動くんですか?

737 :デフォルトの名無しさん:02/04/30 00:06
何する気だテメー

738 :デフォルトの名無しさん:02/04/30 00:06
>731
まぁ、そうとも言う。Cでも似たようなのあるけどさ。
全部小文字だから許せない(嘘)
で、常識を教えてくれ。(下さい)

739 :shige:02/04/30 00:08
関数名は「小文字 + アンダースコアつなぎ」が常識!!!
プログラミング言語はRubyがさいこーが常識!!!!


740 :デフォルトの名無しさん:02/04/30 00:08
>>730
おしい。
"data\\PlayerData.dat"
じゃない?

741 :デフォルトの名無しさん:02/04/30 00:08
>>737
あなたレスで笑い出す俺はいまヤヴァいんだろうか…

742 :デフォルトの名無しさん:02/04/30 00:08
>>738
日本語.comが使える時代にIsCharAlphaNumericなんて役に立たんぜよ。

743 :デフォルトの名無しさん:02/04/30 00:10
うわ!はえーんだよ!それよか常識おせーろYO

744 :デフォルトの名無しさん:02/04/30 00:11
>>741
だいじょうぶ。オレもちょっと面白かったから。

745 :デフォルトの名無しさん:02/04/30 00:13
>>743
空白か改行か多バイトコードが出現したら、そこで切ればいんじゃない?

746 :デフォルトの名無しさん:02/04/30 00:14
>>743
スペース、括弧、クオーテーション、カンマ以外全部だと思ってればいいんでない?

747 :デフォルトの名無しさん:02/04/30 00:14
>>743
常識なんてないだろ…

748 :746:02/04/30 00:15
あ、カンマは駄目だ、使われてるの見たことある気がする。

749 :デフォルトの名無しさん:02/04/30 00:15
それじゃぁ「...html> 」とかなってるとき駄目ジャン。
やっぱでもあれだ、IsCharAlphaNumericで、.と/だけ飛ばす、と、
いうので、決行完璧なのだろうか。

750 :デフォルトの名無しさん:02/04/30 00:17
>>740
親切にありがとうございました。
うまくいきましたよ。
もっと文字列勉強します。

751 :デフォルトの名無しさん:02/04/30 00:18
日本語.comどうすんだよ。あぁ、あれか、mblen使うのか、
それかあれだ、CharNextとか使うのか、あーかったるい。

752 :デフォルトの名無しさん:02/04/30 00:21
ちょっと待て、~もあるじゃないか。。。

753 :デフォルトの名無しさん:02/04/30 00:23
>>751
つまり結論として、URIとして使っていい文字かどうか調べるより、
使っちゃいけない文字かどうかを調べたほうが手っ取り早いぽい。

もしくは、使っていい文字かどうかのフラグをがつっとテーブルで持つ。
char uri_valid_chars[] = {0,0,0,0,0,1,1,1,1,0,0,0....}
みたいな。

754 :デフォルトの名無しさん:02/04/30 00:23
実際使おうとすればなんだって使えるんだよ。
用途がわからんので詳しくはわからんが、
HTML中からリンクを抽出するのが目的なら、
"javascript:func('A',\"B\")"
だってありえるぞ?

755 :デフォルトの名無しさん:02/04/30 00:23
%7eとかどうすんだよw

756 :デフォルトの名無しさん:02/04/30 00:23
オメーラ 素直に strtok() ススめろよ。

757 :デフォルトの名無しさん:02/04/30 00:24
あ〜〜、どっかにURI判定ライブラリとかありそうな罠。

758 :デフォルトの名無しさん:02/04/30 00:24
htmlからURIを引っこ抜くなら、
俺なら、定義が楽なタグの中だけにするけどな…。

759 :デフォルトの名無しさん:02/04/30 00:25
file:///C:\Windows\winmine.exeとかのリンクはどうするよ?

760 :デフォルトの名無しさん:02/04/30 00:26
index[1].html
とかもありえる。

761 :デフォルトの名無しさん:02/04/30 00:29
C言語が余り関係なくなっているような気がする真夜中

762 :デフォルトの名無しさん:02/04/30 00:30
>>716
float d1,d2,d3,d4,d5,d6;
srand(time(NULL));    <-- ここらで。
printf("サイコロを振る回数を決めてください。\n");

謙虚な奴にはおしえてやれよー。
勉強し始めは動くのが大切なんだからー。

763 :デフォルトの名無しさん:02/04/30 00:31
謙虚じゃない奴には遊びまくってるな(w

764 :デフォルトの名無しさん:02/04/30 00:32
だから strtok() でいいだろーよ。

765 :デフォルトの名無しさん:02/04/30 00:34
>>764
だとしてもその引数に何を渡すか問題だ・・・

766 :デフォルトの名無しさん:02/04/30 00:39
>>762
ついでに、736にも答えてあげれば?

767 :762じゃないけど:02/04/30 00:42
今K&Rが手元にない・・・(´・ω・`)ショボーン

768 :デフォルトの名無しさん:02/04/30 00:43
いと○っさんめ!

769 :デフォルトの名無しさん:02/04/30 00:43
rfc 2068: Hypertext Transfer Protocol -- HTTP/1.1
で、区切り文字調べろ。


770 :デフォルトの名無しさん:02/04/30 00:45
>>736
動くんでない

771 :デフォルトの名無しさん:02/04/30 00:45
>>769
現実にはそこに書かれていない文字も使用されているという罠。
仕様にあわせてまともに動作しないものを作るか、
実情に合わせて仕様を無視するか、それが問題だ。

772 :デフォルトの名無しさん:02/04/30 00:52
>>736
UNIX系だとプロセスの外側の領域には無理でないかい。
Windows系、Mac系はわからん。
ヘンナコト スルナヨ。

773 :デフォルトの名無しさん:02/04/30 00:53
>>736
タイーホ

774 :デフォルトの名無しさん:02/04/30 00:55
>>736
移動する方向で転送の方法を変えるから
移動前と移動後の領域が重なっても大丈夫。

775 :712:02/04/30 01:20
>>713

それがそうなんですよ。
いや、最初はHellow Would!!
がプロンプトに何の問題も無く表示されたんですけど
別のプログラムコンパイルして実行しようとすると
あのウインドウが。
ついてにHellowWouldの方でもその
ウィンドウが出るようになった。
コンパイラを上書きインストールしても直らないし。
どうしたら良いのでしょうか

776 :デフォルトの名無しさん:02/04/30 01:21
>>775
どのタイミング?
コンパイル?
実行?
打ち込んでるコマンドライン、良ければここに書いてみたら?

777 :デフォルトの名無しさん:02/04/30 01:22
>>775
それが本当なら今あなたが使っているブラウザだって起動できなくなるってことだよ。


もしかして.cや.objとかを実行しようとしていない?

778 :デフォルトの名無しさん:02/04/30 01:24
>>775
たぶん
Hellow Would!!
が原因。

779 :デフォルトの名無しさん:02/04/30 01:25
>>778
茶化すな

780 :712:02/04/30 01:25
cd bcc
これでbccフォルダ(ソースファイルのあるところ)に移動して

bcc32 test.c
これでコンパイル

test.c
これで実行すると

例のウインドウが開くのですが・・・・・・・・・・・・

781 :デフォルトの名無しさん:02/04/30 01:25
>>778
面白いよ。

782 :デフォルトの名無しさん:02/04/30 01:25
>>775は何か勘違いをしているに1000HellowWould


783 :デフォルトの名無しさん:02/04/30 01:26
>>780
最初は出来たっての嘘だろ。

784 :デフォルトの名無しさん:02/04/30 01:26
>>780
やっぱり(笑)
ソースコードを実行しようとしてどうするのよ(笑)
test.cじゃなくてtest(もしくはtest.exe)ね。

785 :デフォルトの名無しさん:02/04/30 01:26
>>779
ここでそれはムリ

786 :712:02/04/30 01:28
なるほど・・・・・
馬鹿丸出しでしたね。
いや、最初の頃はマニュアル読みながらだったんで。
いつのまにか変な勘違いをしてしまいました。
でも解決できて嬉しい!!!
どうも有難うございました!!!

787 :デフォルトの名無しさん:02/04/30 01:28
>>780
やっぱりそんなことだろうとは思ってたよ(藁


788 :デフォルトの名無しさん:02/04/30 01:29
>>780
.cは実行できないよ。ただのテキストファイルじゃん。
.exeを実行しようね。

ちなみに、ハリウッドのスペル間違ってるよ。HollyWoodだろ。

789 :デフォルトの名無しさん:02/04/30 01:30
山田くーん、>>788の座布団全部もってゆきなさい。

790 :デフォルトの名無しさん:02/04/30 01:30
>>788
爆笑してうまくキーが打てねーじゃねぇかドルァ!

791 :デフォルトの名無しさん:02/04/30 01:30
>>778はある意味正解だったな。

792 :デフォルトの名無しさん:02/04/30 01:43
おい優秀なやつ!
自然対数と正弦と余弦と正接ってなんですか?
数学バカな漏れに教えてください

793 :デフォルトの名無しさん:02/04/30 01:44
>>792
なんでここで聞くのよー(/_;。) ウッウッウッ
数学バカなら自分で分かるはずでしょ。

794 :デフォルトの名無しさん:02/04/30 01:45
log,sin,cos,tan,氏ね

795 :デフォルトの名無しさん:02/04/30 01:46
言葉が違ったかな・・・(._.;)
数学無知ってことにしてください

796 :デフォルトの名無しさん:02/04/30 01:48
超越関数板に逝ってください。

797 :デフォルトの名無しさん:02/04/30 01:49
>>792

#include <math.h>

double log(double);//自然対数
double sin(double);//正弦
double cos(double);//余弦
double tan(double);//正接


798 :デフォルトの名無しさん:02/04/30 01:50
>>792
あーそうそう、もしgccなら-lmをつけてね。

799 :792:02/04/30 01:56
さんきゅ〜です!
超絶倫兄貴板に逝ってきます、スンマセンデシタ

800 :796:02/04/30 01:57
あ〜そっちだったか

801 :デフォルトの名無しさん:02/04/30 02:03
>>792 >>795
・・・妙に可愛い。

いじめて イイ?

802 :796:02/04/30 02:06
>>801
彼なら超黄金脱糞板に逝っちゃいました。

803 :デフォルトの名無しさん:02/04/30 02:06
>>801
うん

804 :デフォルトの名無しさん:02/04/30 02:07
女性SEに虐められたい。
age

805 :801:02/04/30 02:22
チッ

806 :デフォルトの名無しさん:02/04/30 12:16
さがっているのでage

随時Cに関する質問を受け付けています。


807 :デフォルトの名無しさん:02/04/30 14:22
「はじめての C」なる本を本屋で見つけまして、初心者ながら
興味があったので読んでいました。

日頃から秀丸エディタのマクロを覚えてみたいと思っていて、
C の知識が多少無いと。とか聞いていたのですが、本当ですか?

あと、VB等のように専用のソフトは要らないんでしょうか?
書いてある文を読むところでは、コンパイラがあればよく、
付属のCD-ROMに入っているので、これを使えば良いらしいのですが。

808 :デフォルトの名無しさん:02/04/30 14:27
>>807
CD-ROMがあるなら、とりあえずインストールしてみな。
自分でやれるところまでやって、いきづまったら質問してみそ。
あと、そのCD-ROMに入ってるのが有名なコンパイラなら、
Web検索すれば、インストールのしかたを説明したページが必ずあるから
そういうのを探すのも覚えれ。

809 :デフォルトの名無しさん:02/04/30 19:32
すいません(汗
.NETのC++とかc#とかは
C言語もコンパイルできますよね?

810 :デフォルトの名無しさん:02/04/30 19:33
>>809
Visual C++.NETは多分できると思う・・・
C#は無理でしょ。

811 :デフォルトの名無しさん:02/04/30 19:36
>>810
うわ〜
後輩に出来るとか言っちゃった…
今日給料日だからいきなり買ってました…(汗
どうしよ(涙

812 :デフォルトの名無しさん:02/04/30 19:40
http://www.microsoft.com/japan/msdn/siteguide/products.asp

> Visual C++
> C/C++ 言語の学習から、Web アプリケーションや WindowsR アプリケーションの作成まで対応した C/C++ 開発環境です。使いやすい開発環境、豊富な資料を備えていますので、C/C++ 言語によるプログラミン
> グの学習に最適です。

少なくともVC++はできるな。できないと困るし・・・

813 :デフォルトの名無しさん:02/04/30 19:40
悪いことはイワンborland C++とgccを使っとけ

814 :デフォルトの名無しさん:02/04/30 19:41
>>807
文法はC。ただそれだけ。
薄いCの入門書の半分くらい読めば書ける。

815 :デフォルトの名無しさん:02/04/30 20:04
char* expand(char s[],char *p)
{
 int c, e, i, n;
 for(i = n = 0;p[i];i++){
  for(;p[i] != '-';i++)
   if(p[i] == '\0') break;
  if(i == 0 || !isalnum(c = p[i-1]) || !isalnum(e = p[i+1]))
   continue;
  for((n && s[n-1] == c)? n-- :0;c <= e;)
   s[n++] = c++;
 }
 s[n] = '\0';
 return s;
}

A-Z表記をexpandする関数なんだけど評価してくれる?

816 :デフォルトの名無しさん:02/04/30 20:27
forと使い分けようぜ。
あとポインタ使え。
前後にあちこち動く添え字演算はおうの面倒だ。

isalnumあたりはマクロで実装されてる場合があるから
(isalnum)(xx)みたいにしとけ。

細かい動きは追ってないけど、もっとすっきり書け。


817 :デフォルトの名無しさん:02/04/30 20:37
素直に書いた方がいいぞ。
isalnumのときだけ、という要件ならこんなかんじ。
文字コードの大小もしっかり見た方がいいがとりあえずコレで。

char *expand(char s[], char *p)
{
 char *d = s;
 while (*p)
 {
  if (p[1] == '-' && isalnum(p[0]) && isalnum(p[2]))
  {
   int c = (p[0] & 0xff);
   int ed = (p[2] & 0xff);
   while (c <= ed)
   {
    *d++ = c++;
   }
   p += 3;
  }
  else
  {
   *d++ = *p++;
  }
 }
 *d = '\0';
 return s:
}


818 :807:02/04/30 20:39
これでした。

C言語 (1) はじめてのCプログラミング 
倉薫 著 定価:1900円 翔泳社


819 :デフォルトの名無しさん:02/04/30 20:45
char s[]とchar*pを区別する?のは、一般的なのか?
const付けられない実用上の理由でもあるのか?
つか、sとpって名前が意味不明すぎ。

820 :デフォルトの名無しさん:02/04/30 20:48
sは「配列の先頭」で、バッファ的な使い方するつもりだぞ。
pはとりあえず先頭を渡すけどなかでぐりぐりうごかしちゃうぞ。

と意を汲むべきだと思うがね。

constを覚えてないうちは、とりあえずコレでもいいんでないの?


821 :デフォルトの名無しさん:02/04/30 20:49
興味を持った〜くらいから入るならこれでいいんでない?
読んだことないけど。

ポインタは電話番号
にワラタ。

たまに普通だったり秘書がでてきたりするのか?


822 :デフォルトの名無しさん:02/04/30 20:50
>820
つまり、
s[i++] = *p++;
みたいに使うってことなのか?

823 :デフォルトの名無しさん:02/04/30 21:01
constってそんなに重要ですか?

824 :デフォルトの名無しさん:02/04/30 21:03
重要って言うか、無いとダメ。
必要ない文脈でもキャストしなきゃいけなくなる

825 :デフォルトの名無しさん:02/04/30 21:05
>>823
重要だろう。最小特権を強制できるし。キャストは抜きにして。

826 :デフォルトの名無しさん:02/04/30 21:06
っていうか、そもそも1文字にしか適用できないのはだめすぎ。

827 :デフォルトの名無しさん:02/04/30 21:06
ちょうどconstの話なので、
char * const *p
p は 「charへの読み出し専用ポインタ」への(読み出し専用でない)ポインタ

char * const * const p
p は 「charへの読み出し専用ポインタ」への読み出し専用ポインタ

でいいですか? constついてるとなんかわかりにくくて


828 :デフォルトの名無しさん:02/04/30 21:08
まあ、const って書いとけば、「俺はこの変数は変更するつもりはないんだ
ぞ。」ってことが、コンパイラと保守する人 (自分を含む) に伝わるから、
書くにこしたことはない。あと一部の環境では、変数を ROM 領域に置くとか
の嬉しい機能があるかもしれない。

829 :デフォルトの名無しさん:02/04/30 21:09
参考書買いに行ったら、初版が2000年、追加で2001年だったけど
CD-ROMで付属してるコンパイラって使えるのでしょうか?(Win XPですが)

830 :829:02/04/30 21:10
ごめん。コンパイラの種類書かないとわかんないですよね。

831 :デフォルトの名無しさん:02/04/30 21:14
>>830
おぃおぃ、そこまでわかるならなぜ種類を書かない?

832 :830:02/04/30 21:59
>831
立ち読みしただけなので、わからないんです。
調べてきます。

833 :デフォルトの名無しさん:02/04/30 22:02
>>832
どんな本だったか(Windowsの本か?)、もしくは本の名前は何か書けばわかるかもな

834 :デフォルトの名無しさん:02/04/30 22:24
>>827
下のやつ、だけどpの値を変更できないことに気付いてる?
p++ ---> だめ
--p ---> だめ
p = xx ---> 初期化以外はダメ


835 :827:02/04/30 22:28
>>834
>下のやつ、だけどpの値を変更できないことに気付いてる?
の、つもりで最後に読み出し専用のポインタとつけたんですが・・いいんですよね?


836 :デフォルトの名無しさん:02/04/30 22:30
>>829-830
その時期なら、LSC-Cの試食版か bcc32 だろう、たぶん。
XPになって使えなくなったコンパイラなんて聞いたこと無いから
大丈夫だと思う。

837 :デフォルトの名無しさん:02/04/30 22:30
char * const * const p;

char * const * (const p); /* pはconst(更新不能) */
char * const ( * (const p) ) /* (ポインタp(更新不能))はポインタ変数である */
char * ( const (* (const p) ); /* (ポインタp(更新不能))はポインタ変数で、指し示す先は変更不能である */
char( * ( const (* (const p) ) ); /* (ポインタp(更新不能))はポインタ変数で、指し示す先は変更不能なポインタである */
( char( * ( const (* (const p) ) ) ); /* ((ポインタp(更新不能))はポインタ変数で、指し示す先は変更不能なポインタ)で、char型の領域を指す */



838 :815:02/04/30 22:33
あ、一杯レス付いてる!みなさん、サソクス!
アホな部分が多くて申し訳ないっす、みなさんのアドバイスを親身に受け取るっす。
どうもでしたm(_ _)m

839 :827:02/04/30 22:36
ところで、
char const *hoge

const char *hoge
はどっちが普通?
質問ばっかすいません。

840 :デフォルトの名無しさん:02/04/30 22:37
const char*
かな。

841 :デフォルトの名無しさん:02/04/30 22:38
俺は下の方。

記憶クラス指定子と型就職子はなんとなく左。
だけど__huge, __far, __nearは右。

上の書き方はあまり見かけないねえ。


842 :デフォルトの名無しさん:02/04/30 22:38
const char*が多いけど、これって例外的な記述方法だよな。

char const c;
char const * const pc;
char const * const * const ppc;

const char c;
const char * const pc;
const char * const * const ppc;

↑これ見てどう思う?

843 :デフォルトの名無しさん:02/04/30 22:42
そもそも内側のconstは書くことないなあ。
書いてもいいんだが、その、つまり、面倒でなあ。

ポインタのエリアスを作るときはそういうの重要になるけど、
普通に使う分には、最終的な参照先がconstか非constか、しか
気にしてないね。

コンパイラの警告がでたら、正しい型宣言に直すけど。


844 :デフォルトの名無しさん:02/04/30 22:46
>>843
仮引数自体がconstかどうかは呼出元にとって意味ないからね。
実装の問題であって、インターフェイスの問題ではない。
register修飾とかもそうだよな。

それがポインタのときの指す先についてのconstはインターフェイスの問題になる。

845 :デフォルトの名無しさん:02/04/30 22:47
> char const * const pc;
> char const * const * const ppc;
この位になってくると絶対どこかで切ってtypedefしちゃうので
 const char * c; // 定数(const char)を指しているポインタ
 char * const c; // c 自体が定数っぽい気分になる
と直感的に読める書き方をしてしまう傾向があるなぁ、俺は。

846 :827:02/04/30 22:49
>>843
僕もそうです。んで、ちょっとここで聞いてみたわけです。

ポインタのエイリアスって、C++の「参照」から「参照先の値を得るときに
*をつけなくてもいい」って機能を除いた感じですか?
(c++知らないので馬鹿言ってるかも)

847 :デフォルトの名無しさん:02/04/30 22:53
>>846
混乱してないか?
参照は*いらないぞ。

848 :デフォルトの名無しさん:02/04/30 22:54
二次元配列で
char **pp;
とかがあるときに、
処理の途中で

char *p = *pp;

みたいなことするよね。

p もppも同じエリアを見に行く可能性があるとき、後から作った方をエリアスっていうんだけど

constとかvolatileとかポインタ演算とか関数呼び出しが入り乱れてくると
コンパイラがうまく最適化できなくて間違ったコードを生成したり、
最適化をあきらめちゃうことがある。

まともな最適化コンパイラなら、エイリアスに対してどういう最適化をするか
決めるオプションとかあるでよ?

849 :デフォルトの名無しさん:02/04/30 22:56
ついでに無神経なポインタキャストも、最適化の障害になったり、
過ったコードを生成するトリガになる。

一処理一関数。
シンプルに問題を切り分けていけば、べつに混乱することもないんだけどね。


850 :829=807:02/05/01 00:00
>833、836さん ありがとう。
ほんの名前はこれです。
C言語 (1) はじめてのCプログラミング 
倉薫 著 定価:1900円 翔泳社


851 :デフォルトの名無しさん:02/05/01 00:06
>>850
http://www.seshop.com/detail.asp?pid=720

LSI-C試食版だな。
ある程度回線に余裕があるか、テレホなら
http://www.borland.co.jp/cppbuilder/freecompiler/
からBorland Free C/C++コンパイラを落として使った方がいいと思う。

852 :デフォルトの名無しさん:02/05/01 00:18
もちろん、LSI-C86の試食版はそのままでXPで使えるけどな。

853 :デフォルトの名無しさん:02/05/01 00:18
XP'で'使えるが、XPの機能を使うことは出来ない。

854 :デフォルトの名無しさん:02/05/01 00:33
試食版だけが欲しいなら、ここで
http://www.vector.co.jp/soft/maker/lsi/se001169.html

855 :デフォルトの名無しさん:02/05/01 01:01
>>850

>C言語 (1) はじめてのCプログラミング 
>倉薫 著 定価:1900円 翔泳社

ポインターは電話番号だって逝ってるヤツか?
なら他を探した方がイイぞ
簡単にイメージさせようとしてるんだろうが余計ワケワカになる

てゆーか秀丸のマクロ組みたいだけならスゴイ遠回りと思われ

856 :855:02/05/01 01:14
それと、
この作者はたぶんCでの実戦経験が少ないと思う
配列の添字が0から始まってる事がCのバグの原因のほとんどだ
なんて書いてた気がする(W

857 :デフォルトの名無しさん:02/05/01 01:34
>>856
そりゃひでぇ(禿藁

858 :デフォルトの名無しさん:02/05/01 01:42
>>856
BASIC上がりなのかね。

859 :デフォルトの名無しさん:02/05/01 01:48
>>856
ワラタ
添え字が0から始まらなかったら、a[i]==*(a+i)の関係が成り立たなくてそれこそバグの原因になると思う。

860 :855:02/05/01 01:59
思い出した
構造体のメンバーにポインターを介してアクセスするとき
なんで" -> "なんて書くのか意味不明とかも書いてたと思う

手元に無いので記憶はあやふやだが、
誰か持ってない?

861 :デフォルトの名無しさん:02/05/01 02:03
推薦図書スレのほかに買ってはいけない図書スレがほしいな。

862 :デフォルトの名無しさん:02/05/01 02:04
int a[5];
って宣言して5こ分しか確保されないのが納得いかないんだろうね<BASIC上がり

863 :デフォルトの名無しさん:02/05/01 07:03
なんだ奇書か。

864 :850:02/05/01 12:36
この本、だめっすか?

865 :デフォルトの名無しさん:02/05/01 12:37
>>864
話のたねにはいいかも(藁
でも参考にしてはいけない。

866 :デフォルトの名無しさん:02/05/01 12:44
やっぱ、はじめてのCでしょ。
パチモソは移管。

867 :デフォルトの名無しさん:02/05/01 12:47
>>866
ま、まなタンですか?ハァハァ・・・・・・

868 :デフォルトの名無しさん:02/05/01 13:06
>866
これかい?
改訂第3版 はじめてのC ANSI C対応
椋田 實 著
ISBN 4-8740-8546-6 技術評論社 1845円

869 :867:02/05/01 13:10
あ、、、まなタンは「やさしいC」だった・・・・
読んだことないけど。

870 :デフォルトの名無しさん:02/05/01 13:37
優しいC
麻奈タン・・・(*´д`)

871 :デフォルトの名無しさん:02/05/01 13:40
試しておぼえるC

872 :デフォルトの名無しさん:02/05/01 13:40
IMEのバッファの取得の仕方を教えてください。

873 :デフォルトの名無しさん:02/05/01 13:43
>>872
シラネーヨ

874 :デフォルトの名無しさん:02/05/01 13:46
http://tokyo.cool.ne.jp/masapico/api_ImmGetCompositionString.html


875 :デフォルトの名無しさん:02/05/01 14:39
>>874

ありがとです。^^

876 :デフォルトの名無しさん:02/05/01 15:49
プログラム技術板一の良スレだな。

877 :デフォルトの名無しさん:02/05/01 16:13
872です

IMEのバッファにデータを入れる方法を教えてください。



878 :デフォルトの名無しさん:02/05/01 16:14
シネ

879 :デフォルトの名無しさん:02/05/01 16:26
874の責任。

880 :教えて!:02/05/01 16:49
strspnの説明がよくわからないんですが・・・・
接頭子の長さを返すってどういうことですか?
あとstrcspnも・・

881 :デフォルトの名無しさん:02/05/01 17:42
>>880
size_t strspn( const char *string1, const char *string2 );
string2 で指定した文字群にない文字が string1 内に最初に現れた位置
のインデックスを返します。終端の NULL 文字 (\0) は、検索の対象外で
す。

の説明でわかんない ? ついでにサンプル...

--------------------------------------------------------------
char string[] = "cabbage";
int result;
result = strspn( string, "abc" );
printf( "文字列 '%s' のうち a、b、c のみから構成される"
"部分の長さは %d バイトです。\n", string, result );

出力
文字列 'cabbage' のうち a、b、c のみから構成される部分の長さは 5
バイトです。
--------------------------------------------------------------

をみてもわからんか ? だったら、この関数使わなきゃいいと思うが...。

882 :デフォルトの名無しさん:02/05/01 17:51
strspn()ってどんなときに使うんだろ?

883 :デフォルトの名無しさん:02/05/01 18:37
>>882
もしかして、URLに指定しちゃいけない文字列をstring2に渡せば、
上のほうで議論してた「URLっぽい文字列抽出」に役立ったりして。

884 :デフォルトの名無しさん:02/05/01 19:15
>>883
(・∀・)ソレダ!

885 :デフォルトの名無しさん:02/05/01 19:48
>>883
そりゃ名案だ!

const char *str2="0-9A-Za-z_-.*/?#=&"; /* 0-9A-Za-zは実際は展開して書く */

こんな感じかな?
本当は使えないけど'~'も入れておいた方がいいかも。

886 :885:02/05/01 19:49
ポートを指定するときの:も加えた方がいいか。

887 :デフォルトの名無しさん:02/05/01 19:51
喪前ら、そんなショボいパーザじゃなくて、yacc使って書けよ

888 :デフォルトの名無しさん:02/05/01 20:05
char hoge[] = "hoge,3";
char temp[10];
int a;

sscanf(hoge, "%s,%d", temp, &a);

とするとtempが"hoge,3"となり、aにゴミが入ります、
hogeと3が"hoge 3"と空白で分けられていたら
"%s %d"でいけたんですが、カンマの場合はsscanfはつかえないんですか?
"hoge,3" を"3,hoge"にするというのは無しで。


889 :デフォルトの名無しさん:02/05/01 20:20
sscanfつかうの止めろ

890 :デフォルトの名無しさん:02/05/01 20:42
>>889はバカ。

>>888もたぶんバカ。
きちんと規格書嫁。

sscanf(hoge, "%[^,],%d", temp, &a);
にしとけ。

業務用のコード書いてるなら、書式に長さの指定もきちんとかいとけ。


891 :888:02/05/01 20:50
>>890
多分じゃなく確実に馬鹿な888です。

ありがとう。それでいけました。
特に業務用のコードってわけじゃなく、Cの勉強中です。
[^,]というのは正規表現で使う文字クラス指定のことですか?
あと、規格書ってどこで読めるんでしょう?


892 :デフォルトの名無しさん:02/05/01 20:54
>>891
ISOからPDF購入してください。
\2k程度です。($18)

893 :893:02/05/01 20:58
みなさん、コンパイルって、何でしてますか?


894 :デフォルトの名無しさん:02/05/01 20:59
脳内

895 :893:02/05/01 21:00
マジで?

896 :888:02/05/01 21:01
>>891
と、おもったら、[^...]の解説はk&Rにちゃんと載ってますね。
すいません。読みたりませんでした。

>>892
ああ、買わないといけないんですか。この機会にかってみようかな。

897 :デフォルトの名無しさん:02/05/01 21:06
>>896
K&Rあるならとりあえずそれで足りるよ。
Win系ならコンパイラにライブラリのヘルプが付いてるだろ?


898 :デフォルトの名無しさん:02/05/01 21:08
>>895
おまえは出来ないの?

899 :893:02/05/01 21:16
実を言うと、AN HTTPDでローカルサーバ(?)を動かしていて、
PerlのCGIをテストしているのですが、Cで作ったCGIも動かしたくて、
いい方法を探していたのですが…。

参考になりそうな、サイトありませんか?

900 :デフォルトの名無しさん:02/05/01 21:16
訓練してなきゃできないだろ。
そのうち、な。


901 :デフォルトの名無しさん:02/05/01 21:16
>>885
> 0-9A-Za-zは実際は展開して書く
せっかくだから、使ってやれや >>817

902 :888:02/05/01 21:17
>>897
フリーのbcc32なので、ライブラリヘルプがありません。

あと、書式付出力のとき精度や、幅を
変数で指定したいときにつかう*のようなものを使いたいんですが
書式付入力のときには * は代入抑止になるようで出来ませんでした。
890さんのいう「長さ指定しとけ」ってのは長さを直接書いておくんですか?

別に変数にして、そのつど長さを変えるというより
あらかじめ文字列長を#defineしておいて、'\0'の分1引いて
最大でSTR_SIZE-1だけ読み込むという形にしたいのですが。

分かりにくい&長くて すいません。

903 :デフォルトの名無しさん:02/05/01 21:18
>>899
ん?コンパイルすれば実行できるはずだが?

904 :903:02/05/01 21:20
ああ、あなたは>>893なの・・・・
私はgccでコンパイルしているけど。

905 :デフォルトの名無しさん:02/05/01 21:21
>>902
もしかしたらマイクロソフトのMSDNライブラリWeb版に載っているかも。

906 :デフォルトの名無しさん:02/05/01 21:27
>>896
いわゆるC89の範囲内でよければ、JISになっています。2000年度版まではJISハ
ンドブックの情報処理、プログラミング言語編に含まれていました。JISハンド
ブックは公立図書館に置いてあったりするので重宝しましたが、2001年度版に
はプログラミング言語編は含まれてません。Cの規格標だけを買おうとすると
たしか8,000円くらいです。

http://www.jsa.or.jp/

なんかWeb Storeを開設する予定はあるらしい。安くなるといいね。

907 :880:02/05/01 21:29
>>881
ふむふむφ(..)
詳しい解説、感謝です!

908 :デフォルトの名無しさん:02/05/01 21:30
>>907
で、分かったの?

909 :デフォルトの名無しさん:02/05/01 21:32
>>883

> URLに指定しちゃいけない

ではなくて「URLに指定できる」じゃない?

910 :デフォルトの名無しさん:02/05/01 21:36
>909,883
日本語ドメインを忘れているぞ。


911 :デフォルトの名無しさん:02/05/01 21:38
>>910
そんなものを考慮していたらきりがない。
考慮するなら、http://から行末までリンクするしかないだろ。

http://www.お名前.com/

912 :デフォルトの名無しさん:02/05/01 21:43
>>885
URLエンコードの%を忘れている。

913 :880:02/05/01 21:48
>>907
はい、わかりますた。サンクス!でした

914 :デフォルトの名無しさん:02/05/01 21:54
>>902
コレもK&Rに載ってるはずだが、プリプロセッサがマクロに渡した引数を
リテラルに置き換える機能、連続したリテラルを一つのリテラルにまとめる
機能を持っている。

こんなかんじ。

#include <stdio.h>

#define LEN 32
#define TOSTR(x) #x

int main()
{
char buf[256];
char buf2[LEN+1];

while (fgets(buf, sizeof(buf), stdin) != 0)
{
sscanf(buf, "%" TOSTR(LEN) "s", buf2);
}
return 0;
}



915 :888=902:02/05/01 22:07
>>914
あぁ、こんどはプリプロセッサのところを見ないといけなかったんですね。
本当に、ありがとうございました。

読み直します。

916 :899:02/05/01 22:19
出来ないんですけど・・・。

917 :デフォルトの名無しさん:02/05/01 22:22
>>916
きちんと必要最低限のヘッダーを出力しているか?
Content-Typeとか。

918 :899:02/05/01 22:23
#include<stdio.h>
int main(int argc,char* argv[])
{
printf("content-type:text/html\n\n");
printf("<html><body>Hello World!</body></html>\n");
return(1);
}

をコンパイルすればいいんですよね?

919 :915:02/05/01 22:24
>>914
うーん。
それ、やってみたんですが
TOSTR(LEN)のLENがそのまま"LEN"という文字列として連結されて
いるようなんですが・・・。


920 :デフォルトの名無しさん:02/05/01 22:24
\r\n\r\nだろ

921 :デフォルトの名無しさん:02/05/01 22:24
>>918
そうそう。
(ヘッダーの単語の一文字目は大文字にしようよ・・・)

922 :899:02/05/01 22:25
>>921
これをコンパイルして、どのファイルを実行すればいいんですか?

923 :デフォルトの名無しさん:02/05/01 22:26
>>922
(T_T)
コンパイルしてできたファイルに決まっているじゃない(T_T)
.cgiをCGIとして実行するようにしているならファイル名をhello.cgiとでもする。

924 :899:02/05/01 22:29
>>923
Microsoft Visual C++でコンパイルしているんですけど、.dsp .dsw .ccp .h とか
いろいろな、拡張子のファイルが出来ちゃうんですけど…。

925 :914:02/05/01 22:29
(゚д゚)<あらやだ

926 :デフォルトの名無しさん:02/05/01 22:30
お前ら根気強いな・・・俺だったら100パー無視するぞ、こんなの。

927 :デフォルトの名無しさん:02/05/01 22:31
>>924
統合開発環境を使っているのか。
ビルドするとDebugかReleaseフォルダに.exeファイルができるでしょ。
それを.cgiに変えればよいの(.cgiをCGIとして実行するようにしている場合)

CGIプログラムならテキストエディタにコードを書いてコマンドラインからコンパイルした方がいいと思う。
「-o 出力ファイル名」でうまくやってくれる。

928 :927:02/05/01 22:34
混乱を招きそうだな・・・
-oオプションね。

cl -o hello.cgi hello.cってな感じ。

929 :899:02/05/01 22:35
すみません。
HTTP 500 内部サーバー エラー
になっちゃうんですけど。

930 :899:02/05/01 22:36
>>928
ところで、
あなたは、何のコンパイラーを使っていますか?

931 :デフォルトの名無しさん:02/05/01 22:36
>>929
telnetで出力を見てみろ

932 :デフォルトの名無しさん:02/05/01 22:36
>>930
...

933 :デフォルトの名無しさん:02/05/01 22:37
>>930
LinuxではgccでwinではVC++6.0

934 :899:02/05/01 22:38
>>931
telnetってwindows2000に付属しているやつでいいんですか?

935 :デフォルトの名無しさん:02/05/01 22:39
>>934
とりあえずコンパイルしたプログラムを一度DOS窓から実行してみろ。

936 :デフォルトの名無しさん:02/05/01 22:39
>>934
なんでもいいから

telnet 127.0.0.1 80
GET /cgiのパス↓


と入力しろ。矢印はエンターな

937 :デフォルトの名無しさん:02/05/01 22:42
>>914, >>919
# 演算子への引数は、それ以上マクロ展開されないよ。

>>918
関係ないとは思うが、なんで return 1 なの ?

938 :899:02/05/01 22:45
>>937
Windowsに正常終了は似合わないからです。

939 :899:02/05/01 22:45
>>936
telnet 127.0.0.1 80
はどこに入力するんですか?


940 :デフォルトの名無しさん:02/05/01 22:46
>>938
...
もしかして壮大なネタ?

941 :899:02/05/01 22:47
ねたとかじゃなくて、全く分らないんですけど、
いいサイトがあったら、自分でやりますが…。

942 :デフォルトの名無しさん:02/05/01 22:48
>>940
>>938は偽者。

しっかし、なんで動かないんだか・・・・
Perlなら動いたんだよな?

943 :デフォルトの名無しさん:02/05/01 22:48
だから、改行コードじゃねーの?
\r\n\r\nだろ?

944 :デフォルトの名無しさん:02/05/01 22:49
>>943
AN HTTPdってそんな糞仕様なの?
少なくともApache(Win32)なら\n\nでできるが。

945 :日下部圭子:02/05/01 22:49
http://pc.2ch.net/test/read.cgi/tech/1020260813/l50
新スレ作りました。
早めの移行をお願いします。

946 :899:02/05/01 22:51
perlなら、サーバとしているフォルダのなかにファイルを入れれば、動いています。

947 :デフォルトの名無しさん:02/05/01 22:52
AN HTTPDってもしかして、必ず指定されたプログラム(例えばperl)にプログラムを渡すようにできている?


948 :デフォルトの名無しさん:02/05/01 22:54
>>947
ああ、それだ!
今見てみたら、*.pl *.cgiは無条件でperlに渡してる。
*.exeなら直接実行する設定だ。

949 :899:02/05/01 22:54
えーと、
あんまり設定とか、いじってません。
kentさんの
http://www.kent-web.com/www/anhttpd/settei.html
のページのように設定しました。

950 :デフォルトの名無しさん:02/05/01 22:55
>>948
うわ・・・・なんちゅう糞な仕様だ。
さっさとそんなソフトは捨ててApacheにでも乗り換えろ。


951 :デフォルトの名無しさん:02/05/01 22:56
>>949
手順を書く。
1 プログラムを書く
2 コンパイルする
3 できあがったexeを、public_htmlなどドキュメントルート以下に置く
3 ブラウザでアクセスする

以上。拡張子の名前はexeのままで。

952 :デフォルトの名無しさん:02/05/01 22:56
>>949
なるほどね・・・・
コンパイルされた機械語をPerlに渡しちゃ、そりゃエラーになるわな・・

953 :899:02/05/01 22:56
>>948
ということは、拡張子が.cgiならPerlのCGIって決め付けてるんですか?
AN httpdが。

954 :デフォルトの名無しさん:02/05/01 22:57
続きは新スレで。

955 :デフォルトの名無しさん:02/05/01 22:57
>>953
そうそう。

956 :899:02/05/01 22:58
つまりは、Cで作ったCGIは.exeのままにしておくと。

957 :デフォルトの名無しさん:02/05/01 22:59
>>956
だな。

958 :デフォルトの名無しさん:02/05/01 23:00
>>953
設定を変更すれば可能だけど、
説明するのがめんどくさい

959 :デフォルトの名無しさん:02/05/01 23:01
http://pc.2ch.net/test/read.cgi/tech/1020260813/l50
新スレ。

960 :デフォルトの名無しさん:02/05/01 23:01
>>953
Windowsの仕様すら理解してなかったり。

961 :899:02/05/01 23:02
ありがとうございました!!

962 :デフォルトの名無しさん:02/05/01 23:02
>>959
うるせーな。
せっかくだからこっち消化しようや

963 :デフォルトの名無しさん:02/05/01 23:05
AN HTTPDは.plや.rbという拡張子で実行した方がいいのかな。

964 :デフォルトの名無しさん:02/05/01 23:05
>>963
ん?

965 :デフォルトの名無しさん:02/05/01 23:05
>>963
.cgiで普通に動きます。


966 :デフォルトの名無しさん:02/05/01 23:06
>>962
1000ゲットしたいだけちゃうか?

967 :デフォルトの名無しさん:02/05/01 23:06
>>964
.cgiのような汎用的なものじゃなくて、中身によって変えた方がいいのかなと。
Apache(Win32)だと最初の行の#!を理解してくれるからその必要はないけど。

968 :デフォルトの名無しさん:02/05/01 23:06
>>965
設定したとおりにしか動きません。
*.cgiをperlに設定したら、ネイティブコードやRubyスクリプトで動作させるのは不可能です。

969 :デフォルトの名無しさん:02/05/01 23:08
>>967
マルチユーザーのシステムでは使わないことだ。
ひとりなら、*.cgiを一つのアプリケーションに設定しても問題ないだろ

970 :デフォルトの名無しさん:02/05/01 23:08
>>966
俺はもう新スレで1000取ったので満足です。

971 :デフォルトの名無しさん:02/05/01 23:09
>>969
うん。


972 :デフォルトの名無しさん:02/05/01 23:18
(・∀・)つ|現スレで1000目指しまふ|

973 :デフォルトの名無しさん:02/05/01 23:18
フォルダ単位で実行権与えるとかできんのですか?


974 :デフォルトの名無しさん:02/05/01 23:21
できんのです

975 :899:02/05/02 00:04
AN httpdってサーバーソフト(?)ですよね?

976 :デフォルトの名無しさん:02/05/02 00:07
↑何故そんなことも知らんのだ。

977 :899:02/05/02 00:09
Apacheもサーバーソフトですか?

978 :デフォルトの名無しさん:02/05/02 00:13
>>977
世界一のシェアを誇るWebサーバソフト。

979 :デフォルトの名無しさん:02/05/02 00:19
ただし、On Linux

980 :899:02/05/02 00:22
windows上で動くApacheありませんでしたっけ?

981 :デフォルトの名無しさん:02/05/02 00:23
あるけど、シェア取ってない

982 :899:02/05/02 00:24
シェアとってないって、どういうことですか?

983 :デフォルトの名無しさん:02/05/02 00:27
>>982
Windowsでは普通はIISを使う。
ApacheはUNIX系OSで動かすのが一般的。
で、ウェブサーバはUNIX系OSを使っていることが多いから、Apacheが世界一のシェアを誇っている。

984 :983:02/05/02 00:28
なんかレスがおかしいな・・・
とにかくWindowsサーバに限って話せばApacheはあまり使われていないってことだ。

985 :899:02/05/02 00:38
IISはセキュリティーホールが多いらしいですからね。
ありがとうございました。

986 :デフォルトの名無しさん:02/05/02 00:48
どうしてこのスレはほのぼのしてるんだろう

987 :デフォルトの名無しさん:02/05/02 01:15
   ||
   ||
   ||
   ||
   ||
   ||
   ||
   ||
   ||
 ∧||∧
(  ⌒ ヽ 
 ∪  ノ
  ∪∪

988 :デフォルトの名無しさん:02/05/02 01:16
   ||
   ||
   ||
   ||
   ||
   ||
   ||
   ||
 ∧||∧
(  ⌒ ヽ 
 ∪  ノ
  ∪∪

989 :デフォルトの名無しさん:02/05/02 01:16
   ||
   ||
   ||
   ||
   ||
   ||
 ∧||∧
(  ⌒ ヽ 
 ∪  ノ
  ∪∪

990 :デフォルトの名無しさん:02/05/02 01:16
   ||
   ||
   ||
   ||
   ||
 ∧||∧
(  ⌒ ヽ 
 ∪  ノ
  ∪∪

991 :デフォルトの名無しさん:02/05/02 01:16
   ||
   ||
   ||
   ||
 ∧||∧
(  ⌒ ヽ 
 ∪  ノ
  ∪∪

992 :デフォルトの名無しさん:02/05/02 01:16
   ||
   ||
   ||
 ∧||∧
(  ⌒ ヽ 
 ∪  ノ
  ∪∪

993 :デフォルトの名無しさん:02/05/02 01:16
   ||
   ||
 ∧||∧
(  ⌒ ヽ 
 ∪  ノ
  ∪∪

994 :デフォルトの名無しさん:02/05/02 01:17
   ||
 ∧||∧
(  ⌒ ヽ 
 ∪  ノ
  ∪∪

995 :デフォルトの名無しさん:02/05/02 01:17
 ∧||∧
(  ⌒ ヽ 
 ∪  ノ
  ∪∪

996 :デフォルトの名無しさん:02/05/02 01:17
     /⌒\     /\
    /'⌒'ヽ \  ./\  |
    (●.●) )/   |: |
     >冊/  ./     |: /
   /⌒   ミミ \   〆
   /   / |::|λ|    |
   |√7ミ   |::|  ト、   |
   |:/    V_ハ   |
  /| i         | ∧|∧
   и .i      N /⌒ ヽ )
    λヘ、| i .NV  |   | |
      V\W   ( 、 ∪
              || |
               ∪∪

997 :デフォルトの名無しさん:02/05/02 01:18
    |
    |
    |
  @ノハ@
  ( / ⌒ヽ
   | |   |
   ∪ / ノ.
   .(_/_/

998 :デフォルトの名無しさん:02/05/02 01:18
     ∧_∧
     /⌒ヽ )
    i三 ∪ モウ ダメポ・・・
     |三 |
    (/~∪   ::::::::::::::::::::::
 ̄ ̄ ̄ ̄|  ::::::::::::::::::::::::::::::::::::: ビュゥゥゥー・・・
 口 口  |:::::::::::/ ̄ ̄ ̄\::::::::::::
 口 口  |::::::::/       ヽ::::::::::::::
 口 口  | ̄┌┐l ̄l .| ̄ ̄ ̄| ̄ ̄
 口 口  | | ̄ ̄ ̄| |      | | ̄ ̄
 口 口  | |      | |      | | 

999 :デフォルトの名無しさん:02/05/02 01:18
      ∧_∧
      /⌒ヽ )
     i三 ∪ モウ ダメ・・・ポ・・・
      |三 |
     (/~∪  ::::::::::::::::::::::
 ̄ ̄ ̄ ̄|  ::::::::::::::::::::::::::::::::::::: ビュゥゥゥー・・・
 口 口  |:::::::::::/ ̄ ̄ ̄\::::::::::::
 口 口  |::::::::/       ヽ::::::::::::::
 口 口  | ̄┌┐l ̄l .| ̄ ̄ ̄| ̄ ̄
 口 口  | | ̄ ̄ ̄| |      | | ̄ ̄
 口 口  | |      | |      | | 

1000 :デフォルトの名無しさん:02/05/02 01:19
1000

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

213 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)