07/09/12 10:35:45
自分で書いた方のソースがvoid rev (char *ary)だったんで
レス欄にコピペしたとき、「ああ、strか」と思い
aryの部分をstrに全部書き換えたつもりだったが
中途半端に書き換えちった
というわけ
760:デフォルトの名無しさん
07/09/12 10:48:01
警告を無視する奴は、とりあえず渓谷に行って来い
761:742
07/09/12 15:41:36
>>759
なるほど
あえて自分で考える事が出来たし結果オーライだったw
lenの-1も気づかなかったしなorz
スコープについてはまだ良くわかってないけど・・・
762:デフォルトの名無しさん
07/09/12 22:46:17
スマソ スコープについて調べろってのは勘違い
str2へのポインタを関数の外で使おうとしてるのかと思った
763:デフォルトの名無しさん
07/09/12 22:55:14
2点質問があります。
1.関数で配列全体を呼び出しもとに帰すにはどう記述すればよいのでしょうか?
例)a[0],a[1],a[2],a[3]といった、算出した値を配列要素としてではなく、配列全体をreturn文で返す
方法がわからずにおります。
2. 1+X+X^15で生成する疑似ランダムデータの作製法がわからずにおります。
どうかご教示願います。
764:デフォルトの名無しさん
07/09/12 22:58:17
>>763
マルチポストですか?
スレリンク(tech板:278番)
765:デフォルトの名無しさん
07/09/12 23:03:43
やさしいCを打ち込み終了し他の本も色々調べたのですが、
ポインタとかを理解するにはPICを勉強したほうが分かりやすいですか?
766:デフォルトの名無しさん
07/09/12 23:05:53
>>764
急いでいるのでマルチポストをしてしまいました。申し訳ございません。
767:デフォルトの名無しさん
07/09/12 23:07:33
>>765
問題をやった方が良い
768:デフォルトの名無しさん
07/09/12 23:31:22
>>764
大体、関連した話題を扱うスレッドには同じ人が見にきているものだ。
だからマルチポストするとすぐに見つかってしまう。しかも反感を買い回答が得られなくなる。
だから1箇所に投稿し、回答が得られるまで自分でも必死こいて調べるべし。
769:デフォルトの名無しさん
07/09/12 23:33:34
>>765
問題をやるのがいいな。
770:デフォルトの名無しさん
07/09/12 23:56:35
>>767,769
ありがとうございます。問題を解くことからはじめます。
771:デフォルトの名無しさん
07/09/13 02:41:58
>>771
宿題スレの問題をやってみるとか。
いろんな人が同じ問題を問いて解答も出してくれるので、
自分とここが違う、とか、これはこうやって実現するのか、とか、
いろいろ気づくところがあるかも知れないよ。
772:デフォルトの名無しさん
07/09/13 02:42:28
>>771は>>770にだよう。自分に言ってどうする。
773:デフォルトの名無しさん
07/09/13 02:49:26
標準ライブラリ関数を使わずに、コンソールに文字列を出力してみようと思い
システムコールのwriteを使ってみたつもりです。
#include <unistd.h>
int main(void) {
char s[] = "test\n";
write(1, s, sizeof(s));
return 0;
}
Cygwin の gcc 3.3.3 で、-ansi -Wall -pedantic -fno-builtin で
コンパイルできて、期待した動作になりました。
で、glibc-2.6.1の io/write.c を見ると
/*
続く
774:デフォルトの名無しさん
07/09/13 02:54:40
続き、少しインデントを変えています。
*/
#include <sysdep.h>
#include <errno.h>
#include <unistd.h>
#include <stddef.h>
ssize_t __libc_write (int fd, const void *buf, size_t nbytes)
{
if (nbytes == 0) return 0;
if (fd < 0) {__set_errno (EBADF); return -1;}
if (buf == NULL) {__set_errno (EINVAL); return -1;}
__set_errno (ENOSYS); return -1;
}
libc_hidden_def (__libc_write)
stub_warning (write)
weak_alias (__libc_write, __write)
libc_hidden_weak (__write)
weak_alias (__libc_write, write)
#include <stub-tag.h>
write.c にはこれだけしかないのですが、
fd の値や *buf 内のデータなどは、どこで使われているんでしょうか?
たとえば buf は NULL とだけ比較していますが、
実際に fd に向かって buf を書き込む(?)処理は、どこでやっているんですか?
775:デフォルトの名無しさん
07/09/13 11:37:00
>>773
URLリンク(www.sixnine.net)
>Cygwin は glibc を提供しません。
>代わりに、同じ機能の大部分(全てではありません)を提供する newlib を使用します。
>glibc を Cygwin へ移植するのは難しいでしょう。
776:問題
07/09/13 11:59:26
何方か今から掲示する4問の問題が合ってるか教えてください(パソをメンテに出していて手元になくて調べられないんです^^;)
キーボードより表示開始文字と表示終了文字を入力し、開始~終了までの文字を表示しなさい
char moji[]="ABCDEF~XYZ"; /*大文字26文字*/
実行画面
moji:ABCDEF~XYZ
開始位置==>B
終了位置==>F
表示:BCDEF
moji:ABCDEF~XYZ
開始位置==>D
終了位置==>D
表示:D
moji:ABCDEF~XYZ
開始位置==>E
終了位置==>B
表示:EF~XYZAB
777:776の答え
07/09/13 12:00:14
moji:ABCDEF~XYZ
開始位置==>B
終了位置==>F
表示:BCDEF
778:776の答え(777ミスです)
07/09/13 12:01:06
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char moji[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; /*大文字26文字*/
char start, end, *p;
printf("moji:%s\n", moji);
printf("開始位置==>");
scanf("%c", &start);
fflush(stdin);
printf("終了位置==>");
scanf("%c", &end);
fflush(stdin);
if(!isalpha((int)start) || !isalpha(end)) return 1;
start = (char)toupper(start);
end = (char)toupper(end);
p = moji + start - 'A';
for(;;)
{
putchar(*p);
if(*p == end) break;
if(*(++p) == '\0') p = moji;
}
return 0;
}
779:問題2
07/09/13 12:04:11
文字列と削除文字列を入力し文字列中から削除文字を排除しなさい
実行画面
文字列入力(m1)==>ABCDEFAABCDABC
削除文字==>A
結果文字列(m2):BCDEFBCDBC
780:問題2の答え
07/09/13 12:05:38
#include <stdio.h>
#include <string.h>
#define MAX 256
int main(void)
{
char str[MAX],ch;
size_t sz_str,i;
printf("文字配列入力(m1)==>");
fgets(str,sizeof(str)/sizeof(str[0]),stdin);
sz_str=strlen(str);
printf("排除文字==>");
ch=getchar();
for(i=0; i<sz_str; i++) {
if(str[i]!=ch) putchar(str[i]);
}
return 0;
}
781:デフォルトの名無しさん
07/09/13 12:25:21
この形式の問題何回目だよwwwww
782:デフォルトの名無しさん
07/09/13 12:34:12
くだらん質問なんだけど
バッファサイズを256とか512みたいな16の倍数にしてるコードよく見るけど
そうするとどういう効果があるの?
783:デフォルトの名無しさん
07/09/13 12:34:49
単にキリがいいから使ってるだけ
784:デフォルトの名無しさん
07/09/13 13:12:50
どっちかっつうと2の乗数だが、キリが良いから
785:デフォルトの名無しさん
07/09/13 13:17:36
>>784
2の乗数っていうか、2の羃だね。
786:デフォルトの名無しさん
07/09/13 13:23:03
キリがいいからか
漏れもなんとなくキリがいいから使ってたよw
サソクス
787:デフォルトの名無しさん
07/09/13 13:33:44
文系グラマは100とか1000使うのかな
788:デフォルトの名無しさん
07/09/13 13:46:38
main関数の戻り値ってどういう時使うんですか?
789:デフォルトの名無しさん
07/09/13 13:55:42
>>788
コマンドインタプリタで該当プログラムの終了ステータスとして利用する。
790:デフォルトの名無しさん
07/09/13 15:03:30
>>788
他のプログラムから起動させたとき
791:デフォルトの名無しさん
07/09/13 16:22:48
>>788
#!/bin/sh
if ./a.out; then
echo "成功" # main が 0 を返した時
else
echo "失敗..." # main が 1 を返した時
fi
792:デフォルトの名無しさん
07/09/13 20:54:10
printf("%6.1f",123.45);
を実行すると
123.5
となるのはなぜですか?
123.4になぜなりませんか?
793:デフォルトの名無しさん
07/09/13 20:57:12
一つしたの桁を四捨五入するから。
794:デフォルトの名無しさん
07/09/13 21:01:27
>>793
thx
795:デフォルトの名無しさん
07/09/14 01:02:02
>>775
ありがとうございます。newlibですか。
ではCygwinはおいといて、>>774はglibcの実装についての質問とさせてください。
glibcのwrite.cで定義されている __libc_write の仮引数の使われ方について
なぜこの引数でfdへ書き込みがおこなわれるのでしょうか?
796:デフォルトの名無しさん
07/09/14 02:17:33
たぶんそのソースは実際にコンパイルされるコードじゃない。
システムコールをどうやって呼ぶかはOSやCPUによって異なるから、それはただのプレースホルダだろう。
ざっとみてみたところ、sysdeps/unix/syscalls.listからmake-syscalls.shで自動生成されるんじゃないかと思った。
でも複雑すぎて追いきれん。
実際に特定のターゲット向けにビルドしてみて、生成されたファイルを見なきゃ判らなさそう。
797:デフォルトの名無しさん
07/09/14 02:41:12
>>795
その関数はターゲット用のwrite()が存在しない場合に使われるダミー関数。
writeしても呼ばれない。
798:デフォルトの名無しさん
07/09/14 08:46:05
0: -19.312 -0.144 -0.996 1.412 -0.173 1.933 3.954 4.917 6.333 1.552
-1.515 -1.667 -0.151 0.230 -0.024 0.083 0.377 0.665 0.722 -0.195
-2.321 -1.814 -0.133 0.515 1.343 0.000
1: -19.304 -0.162 -1.799 4.184 1.255 -0.393 -0.335 0.469 1.268 -2.177
-2.390 0.198 -0.151 -0.086 0.111 0.100 0.038 1.462 0.937 -0.569
-0.975 -1.590 -0.486 -0.450 0.133 0.000
2: -18.166 -0.254 -0.178 1.909 2.438 6.705 5.126 -4.463 -0.205 2.752
1.499 4.116 -0.151 0.167 -0.024 -0.312 -0.069 1.179 0.724 -0.214
0.460 -0.921 0.742 0.284 -0.377 0.000
こうかかれたファイルから小数点のところだけ
とりだして二次元配列にいれるにはどうすればいいすかね?
小数点のところ26個あるんですけど。
799:デフォルトの名無しさん
07/09/14 09:33:40
コロンの後まで飛ばして読み込め
800:デフォルトの名無しさん
07/09/14 11:16:37
指定したパスに、ある拡張子のファイルが存在するか調べるために
_dos_findfirstを使用して、BCCでコンパイルしたら
> Warning W8053 2007-09-14_1.c 11: '_dos_findfirst(const signed char *,unsigned int,find_t *)'
> is obsolete in function main
という警告が出ました。obsoleteとは「旧式の、廃れた」という意味です。
これに代わるものはありますか?
801:デフォルトの名無しさん
07/09/14 11:26:11
>>800
dos.hの_dos_findfirst()か、_dos_xxxは古いわなあ。
io.hの_findfirst()でどうか。
802:デフォルトの名無しさん
07/09/14 11:32:30
>>801
なるほど、ありがとうございました。
803:デフォルトの名無しさん
07/09/14 14:01:30
ものすごく初歩的な質問で申し訳ありません。
C言語の入門書にそって勉強していたのですがすぐに躓いてしまいました。
hello worldを表示するソースファイルをコンパイルしようとしたのですが下のエラーが出てきてしまいました。
C:\cwork>bcc32 sample.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
sample.c:
エラー E2209 sample.c 2: インクルードファイル 'stdio.h' をオープンできない
警告 W8065 sample.c 6: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main
)
*** 1 errors in Compile ***
何かと思い検索してみて確認したのですが原因がわかりません。
なにか分かる方いらっしゃればアドバイスよろしくお願いします。
804:デフォルトの名無しさん
07/09/14 14:18:24
>>803
C:\borland\bcc55\Include\ の中にファイルはあるか?
インストールはどのファイルをどうやって実行した?
805:デフォルトの名無しさん
07/09/14 14:24:35
>>803
URLリンク(www.google.co.jp)
806:デフォルトの名無しさん
07/09/14 14:27:54
>>803
PATHを通してないんでしょうな、多分。
807:デフォルトの名無しさん
07/09/14 14:41:49
PATH通してなかったらbcc32自体出来ないだろ
808:デフォルトの名無しさん
07/09/14 14:55:56
オレもそう思った。
cfgもデフォルトだろうし、アップデート用のインストーラ使ったんじゃないかと予想。
809:デフォルトの名無しさん
07/09/14 15:13:25
皆様すばやいレスありがとうございます。
>>804様
C:\borland\bcc55\Includeの中にstdio.hはありました。
インストールはその入門書についてあるCDに収録されていた
freecommandlinetools2.exeというファイルを実行しました。
>>807様
Pathは通したつもりでいます。
入門書に書かれてあることをそのまま行っただけなので間違いないとは言い切れませんが。
810:デフォルトの名無しさん
07/09/14 15:20:23
C:\borland\bcc55\Bin に、
bcc32.cfg、ilink32.cfg はあるか?
テキストエディタで開いて、以下に設定されているか確認。無ければ以下のをそれぞれ保存
・bcc32.cfg
-I"c:\Borland\Bcc55\include"
-L"c:\Borland\Bcc55\lib;c:\Borland\Bcc55\lib\PSDK"
・ilink32.cfg
-L"c:\Borland\Bcc55\lib;c:\Borland\Bcc55\lib\PSDK"
811:デフォルトの名無しさん
07/09/14 15:22:48
結局、インクルードパスか、、、cfgが確実だな
812:803
07/09/14 15:36:19
>>810様
bcc32.cfg、ilink32.cfg はC:\borland\bcc55\Binにあります。
bcc32.cfg、ilink32.cfg ともに;c:\Borland\Bcc55\lib\PSDK"の部分はありませんでした。
そこで;c:\Borland\Bcc55\lib\PSDK" を追加してみましたがやはりエラーでした。
813:デフォルトの名無しさん
07/09/14 15:36:28
>>807 >>808
知ったかぶるなら黙ってろ。お前らの頭じゃPATHの意味すらわかってなさそうだから。
814:デフォルトの名無しさん
07/09/14 15:39:02
>>812
面倒くさいんでこれ使っちゃいな
URLリンク(www.vector.co.jp)
815:デフォルトの名無しさん
07/09/14 15:41:25
>>812
どうしても嫌ならこれで
URLリンク(www.enri.go.jp)
816:デフォルトの名無しさん
07/09/14 15:43:39
>>807
カレントディレクトリをコンパイラのある場所に移動すりゃ良いんじゃね?
エラーメッセージから推測できるのは、必要なファイルのある場所の
設定がされていないということ。つまり、そういうことだ。
PATHが必要なものに設定されていればどうなるか、分かるよね?
817:デフォルトの名無しさん
07/09/14 15:43:57
>>813
おまえ、名指しで何か言うなら知ったかしないほうがいいぞ
PATHの意味を言ってみ?
818:デフォルトの名無しさん
07/09/14 15:44:54
>>816
>C:\cwork>bcc32 sample.c
>Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
この2つからPATHが通っているのは明白
819:デフォルトの名無しさん
07/09/14 15:46:34
>>817
味方にボールを送る事に決まってんだろうが
820:デフォルトの名無しさん
07/09/14 15:53:56
それはPASS
821:デフォルトの名無しさん
07/09/14 15:56:07
>>819
アホか
ヤマハの電動アシスト自転車の事だろ
822:803
07/09/14 15:57:16
>>814-815様
ありがとうございます。
試してみようと思います。
>>816様
ソースファイルを作成したc:\cworkというディレクトリに移動しているのですが、こういうことでしょうか?
823:803
07/09/14 16:10:52
>>814様のソフトをダウンロードして自動設定したら解決できました。
皆様お忙しいところくだらない質問に時間を割いていただき本当にありがとうございました。
824:デフォルトの名無しさん
07/09/14 16:13:02
結局、原因はなんだったんだろうな
825:デフォルトの名無しさん
07/09/14 16:19:23
どういたしまして
がんばって
826:デフォルトの名無しさん
07/09/14 16:21:01
cfgのタイプミスだろうなあ・・・
827:デフォルトの名無しさん
07/09/14 16:36:51
>>821の言っている事がわからない
828:デフォルトの名無しさん
07/09/14 16:41:00
知らないならレスしなくていいよ
つーか知っててもスルーしてるが
829:デフォルトの名無しさん
07/09/14 18:49:34
FFFFFF80を2進数に直すと、どうして
11111111 11111111 11111111 1000000になるのかわかりません
特に、80は 0101000では?
830:デフォルトの名無しさん
07/09/14 18:51:39
>>829
(0101)2 → (5)10
831:デフォルトの名無しさん
07/09/14 18:56:10
レス、ありがとうございます
???
間違っているのですか?
832:デフォルトの名無しさん
07/09/14 18:56:41
16進の80
2進だと1000000
10進の80と誤解してると思われ
833:デフォルトの名無しさん
07/09/14 18:59:02
0一個たんなかった
834:デフォルトの名無しさん
07/09/14 19:02:19
>>832
ん~どうしてもわかりません
では、2進数の80では、0101000で合っていて
16進数の80では、どうして1000000になるのでしょうか?
835:デフォルトの名無しさん
07/09/14 19:10:41
2進数の80なんかあるか。2進数は1と0だけ。
836:デフォルトの名無しさん
07/09/14 19:12:30
(x)y を y進法で表すxとする
(80)10 = (0101000)2
(80)16 = (128)10 = (10000000)2
837:デフォルトの名無しさん
07/09/14 19:13:01
16進数の80 = 10進数の128 = 2進数の10000000
16進数の50 = 10進数の80 = 2進数の10100000
838:デフォルトの名無しさん
07/09/14 19:16:47
>>836 >>837
計算違くね
(80)10 = (0101 0000)2
839:837
07/09/14 19:18:05
うぁ。みすorz
840:829
07/09/14 19:23:39
皆さん、レスありがとうございます。
>>16進数の80 = 10進数の128 = 2進数の10000000
16進数の50 = 10進数の80 = 2進数の10100000
では、一旦10進数に置き換えてから、2進ぬするのでしょうか?
どうやれば、16進数の80は10進数の128に、又は16進数の50は10進数の80に
直せるのでしょうか?
841:デフォルトの名無しさん
07/09/14 19:31:21
>>840
ググれば解説しているサイトはたくさんある
842:デフォルトの名無しさん
07/09/14 19:32:12
>>840
16進から2進の場合、は分割するんよ
FFFFFF80
F=1111 , 8 = 1000 , 0=0
あとはくっつける
1111 1111 1111 1111 1111 1111 1000 0000
FFFFFF80(16)=11111111111111111111111110000000(2)
って感じ
843:デフォルトの名無しさん
07/09/14 19:34:44
>>840
失礼、ちょっと訂正
FFFFFF80
F(16)=1111(2) , 8(16)=1000(2) , 0(16)=0000(2) ね
10進に直すより16進→2進 、2進→16進の方が楽(のはず)
844:デフォルトの名無しさん
07/09/14 19:42:23
さすがにゆとり教育杉な気もしてきた
845:デフォルトの名無しさん
07/09/14 19:44:21
C言語がいいらしいんですが無料でできますか?
846:デフォルトの名無しさん
07/09/14 19:46:33
はい
847:デフォルトの名無しさん
07/09/14 20:11:41
ありがとうございましm(__)m
これで先に進めます
848:デフォルトの名無しさん
07/09/14 20:49:08
>>840の解説に同意。
16って2^4(二の四乗)の事ですよね。
つまり、2進数表現4ビットの最大値(1111)
が、16進数Fに相当している事もわかりますよね。
したがって、>>840の解説を御借りすると、
FFFFFF80
F=1111 , 8 = 1000 , 0=0
【|】(パイプ)で区切ると
1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1000 | 0000 (2)
F F F F F F 8 0 (10)
となります。
849:デフォルトの名無しさん
07/09/14 20:50:17
>>840じゃなくて、>>842でした。
850:デフォルトの名無しさん
07/09/14 22:59:14
C言語なんですが、ファイルに書き込むときって自分でEOF書き込むんですか??
それとも、閉じるときに勝手にやってくれるんでしょうか。
851:デフォルトの名無しさん
07/09/14 23:03:47
>>850
閉じるときに勝手にやってくれる。
つか、EOFというデータはないんだけど。
ファイルの最後まで読んだときfreadなどのファイル入出力関数がEOFを返すだけ。
852:デフォルトの名無しさん
07/09/14 23:24:22
あ、そうなんですか!
てっきり、改行コードみたいにEOFっていう記号があるのかと思いました。。。
853:デフォルトの名無しさん
07/09/14 23:37:45
URL
854:デフォルトの名無しさん
07/09/14 23:59:28
>>796 >>797
超ありがとうございます。
勉強します。
855:デフォルトの名無しさん
07/09/15 00:25:48
>>852
EOF=1A じゃなかったかな。昔のテキストファイルには使っていたと聞くよ。
856:852
07/09/15 00:40:18
>>855
MS-DOSのテキストファイルにはEOF(1Ah)が書かれていたようですね。
EOF(1Ah)がファイル内に実際にデータとして書かれているものと書かれていないもの
さらに、書かれているもののうちアプリケーションがこのEOF(1Ah)をデータとして
意識すべきものと意識しなくてよいもの
があるようですね。
ファイルのデータをレングスで管理しているファイルシステムはEOFがなくて、
このレングスがないファイルシステムにはEOFがデータとしてある。
ということでしょうか。
857:852
07/09/15 00:45:30
ということで>>850さん
EOFをアプリケーションで書き出す必要があるかないかは、
「ファイルの仕様による」ということです。
Windowsのハードディスクのファイルは書き出す必要はありません。
858:デフォルトの名無しさん
07/09/15 00:51:53
>>852、855
ありがとうございます~ むっちゃわかりやすかったっす。
859:デフォルトの名無しさん
07/09/15 01:47:18
CのライブラリのEOFとアプリが使う終了のマークを一緒にしたらだめでしょ。
860:デフォルトの名無しさん
07/09/15 02:08:55
>>817
お前とかうぜーよ、偉そうに。英語すら理解していないだろ。
URLリンク(dictionary.goo.ne.jp)
必要なデータやプログラムのある場所へPATHを通しておくことで
どこのディレクトリからでも扱えるようにできるようになることくらい知っているだろ。
っつかお前、DOSとかその他そういった仕組みを持ったシステムを使ったことないだろ?
861:デフォルトの名無しさん
07/09/15 02:12:21
>>857
>Windowsのハードディスクのファイルは書き出す必要はありません。
判っていないのならレスしなくてもよろしいのでは?
862:デフォルトの名無しさん
07/09/15 02:13:29
どうやらPATHの意味をそれぞれ勝手に解釈している同士が罵り合っている模様。
仲のいいことで。
863:デフォルトの名無しさん
07/09/15 02:17:01
>>861
そういうレスはいけないと思うよ。
間違っているを指摘すべきだと思う。
864:デフォルトの名無しさん
07/09/15 02:41:12
猫でもわかるC言語プログラミングP.196によると下記のようなプログラムはだめ
ということですがBCCではコンパイルが通り、実行しても問題は見られませんでした
char *strではなくchar str[32]なら可とのこと
なぜでしょうか?
もうひとつ
下記のプログラムでprintf("%sの長さは%dです\n",*str,len);
のように%sに対して*strとすると実行時にエラーになりますが
*strなら中身のASCIIコードが入っているはずで問題ないと思うのですが…
ご教示願います。
#include <stdio.h>
#include <string.h>
int main()
{
char *str;
size_t len;
printf("文字列を入力してください。--");
scanf("%s", str);
len = strlen(str);
printf("%sの長さは%dです\n",str,len);
return 0;
}
865:デフォルトの名無しさん
07/09/15 02:41:52
>>864
%s→%c
866:デフォルトの名無しさん
07/09/15 02:43:37
char str[32]でも不可です
867:デフォルトの名無しさん
07/09/15 02:48:22
>>864
> 猫でもわかるC言語プログラミングP.196によると下記のようなプログラムはだめ
> ということですがBCCではコンパイルが通り、実行しても問題は見られませんでした
> char *strではなくchar str[32]なら可とのこと
問題が無かったのは str の指す先が*偶然*致命的な場所で無かっただけで
予期しない場所が書き換えられています
str が指す先がちゃんと確保されている場合には問題は無いです
868:デフォルトの名無しさん
07/09/15 03:05:22
>>864
その本には、なぜダメかってのは書いてないのか。
869:デフォルトの名無しさん
07/09/15 04:39:20
scanfとprintfの関数の違いと働きを教えてください。お願いします。
870:デフォルトの名無しさん
07/09/15 04:41:45
URLリンク(ja.wikipedia.org)
URLリンク(ja.wikipedia.org)
871:デフォルトの名無しさん
07/09/15 04:48:43
>>869
scanf - scan with format
printf - print with format
872:デフォルトの名無しさん
07/09/15 14:13:04
さすが猫ですね
873:デフォルトの名無しさん
07/09/16 00:32:08
データが1個増えるたびにreallocしてることが発覚しましたw
バカすぎますか?
874:デフォルトの名無しさん
07/09/16 00:34:36
はい
875:デフォルトの名無しさん
07/09/16 00:34:40
データが増える間隔とデータ量による
876:デフォルトの名無しさん
07/09/16 00:38:15
>>873
実装が楽なので使い捨てコードのときにはそうします
877:デフォルトの名無しさん
07/09/16 00:42:30
>>873
一個ごとでも、まったくOK。
データの複数個ずつぶんのメモリを確保しても、ほとんどの場合は、
スピードアップしません。
878:デフォルトの名無しさん
07/09/16 00:48:01
vectorとかでも中では一回ごとにrealloc的なことしてるんだっけ?
879:デフォルトの名無しさん
07/09/16 01:24:37
>>878
ここは C のスレですぜ
> vector
ってなに?
880:デフォルトの名無しさん
07/09/16 01:34:48
ここは東京だぜ
881:デフォルトの名無しさん
07/09/16 02:19:19
読み込んだ数式を逆ポーランド記法に変換しようとしてるんですが、
1+(3+(4-2)+1)*4
のようにすると、1342-+1+4*-という式になってしまいます。
else if(source[i] == ')'){
while( now > 0 && stack[now -1] != '('){
rpn[r++] = stack[--now];
}
--now;
}
原因がわかりません。教えてください。
できれば解決策もm(_ _)m
882:864
07/09/16 02:45:34
レスありがとうございます
>>865
確かに%cとすると一文字だけですが表示されます
JavaをかじってたこともあってString型がCにもあると思い込み,いわゆる文字列がポインタであることを理解していませんでした
pritf("%d",i);のようにカンマの後には変数名を書けばよいと思っていましたが
%sの場合は例外でポインタを書かないといけないのですね
確かにそうすると表記上はすべて変数名のように見えて綺麗ですから、そのためにそのような設計になったのでしょうか…
>>866
31文字以上は入力しないという前提でも不可なのでしょうか?
>>867
char *str ではポインタ(アドレス変数)が確保されただけでその中身については未定義で
さらに、その中身のアドレスの後ろが他のことに使われていないという保証もないから不可で
char str[32]なら31文字分については安全な場所が確保されるからOKという理解で正しいでしょうか
>>869
本文をそのまま引用すると
『strはchar型へのポインタですね。ということはアドレスを格納する変数なのです。これではだめですね。』
とのことです。
しかし、scanfやstrlenについては、渡すべきものはアドレスであり間違えているようには考えられず
printfについても%sにはポインタを渡すのであっているようなので理由が私にはわかりませんでした。
883:デフォルトの名無しさん
07/09/16 03:18:00
適当な本だな
884:デフォルトの名無しさん
07/09/16 03:34:24
渡すべきものはアドレスだが、その渡しているアドレスの値が適切なのかどうかということだ。
scanfは、渡されたアドレスが示すメモリ領域を書き換えるのだから、適当なアドレスを渡してはいけない。
特に、初期化してないポインタ (どのアドレスを指してるか不定) を渡すなんて、もってのほか。
書き換えられても安全な領域 (char[32]とか) を用意して、そのアドレスを渡す必要がある。
885:881
07/09/16 04:01:59
すみません自己解決しましたm(_ _)m
886:デフォルトの名無しさん
07/09/16 04:12:05
1+(3+(4-2)+1)*4 は逆ポーランド記法で
4 2 - 3 + 1 + 4 * 1 + で合ってますか?
887:デフォルトの名無しさん
07/09/16 04:22:14
車輪の再開発は止めましょう
その程度の計算なら電卓でできます。
暗算でもできるでしょ?
作る意味無いよ
888:デフォルトの名無しさん
07/09/16 04:28:51
∩_
〈〈〈 ヽ
〈⊃ }
∩___∩ | |
| ノ ヽ ! !
/ ● ● | /
| ( _●_) ミ/ <こいつ最高にアホ
彡、 |∪| /
/ __ ヽノ /
(___) /
889:デフォルトの名無しさん
07/09/16 04:58:38
∩___∩
| ノ ヽ !
/ ● ● | こいつも最高にアホ
| ( _●_) ミ
彡、 |∪| / .\
/ __ ヽノ / \ ...\
(___) / .│ ..│
/ ヽ
l..lUUU
.U
890:デフォルトの名無しさん
07/09/16 05:19:03
そんな餌に俺様が釣られクマーー
891:デフォルトの名無しさん
07/09/16 06:42:36
>>886
1342-+1+4*+ かな。
892:デフォルトの名無しさん
07/09/16 08:17:49
>>886
適当に作ってみた。
やっぱり 1342-+1+4*+ になる。
URLリンク(sund1.sakura.ne.jp)
893:デフォルトの名無しさん
07/09/16 09:03:32
>>886
1+(2+3) と 2+3+1 が同じだというならそれでも合ってる
894:デフォルトの名無しさん
07/09/16 12:10:01
>>873-879
おれの居る現場の既存のコードでは、
最終的に300~400MBのメモリを確保するのに、reallocを繰り返して、
延べ 2.5GBぶんコピーを繰り返している事が分かったよ。
DBのテーブルのデータを一度メモリーに全部取り出すんだ...orz
895:デフォルトの名無しさん
07/09/16 12:12:34
>>894
それだとDBの意味ががが
元からなさそうな感じではあるけど
896:デフォルトの名無しさん
07/09/16 12:32:44
realloc()を使うと、毎回確保し直すと思っている馬鹿が多いのか?
自分でわざわざ回数まとめてからrealloc()するようなコード書くより、
毎回realloc()する方が速いかもしれないぞw
897:デフォルトの名無しさん
07/09/16 12:39:00
そんな当たり前の事言われても。
898:894
07/09/16 13:03:07
>>895
まあ100%無意味って訳じゃないんだけどね。一応SQLの恩恵は受けているから。
でもバッチ系が全部、「始めてプログラムを組んだんじゃないか?」ってレベルなんだ。
>>894のコードも基本的に集計するだけだから、DBの設計さえ良ければ単純なSQLで済むはずなのになー。
ハッ、ここは愚痴スレじゃなかったなスマソ。
899:デフォルトの名無しさん
07/09/16 13:10:10
気づいたんなら送信するな
900:894
07/09/16 13:16:21
>>896
その話は聞いたことあるが、そういうレベルじゃない。
reallocその物を使わないで済ませられるような場面でやってるだよ。
901:デフォルトの名無しさん
07/09/16 15:00:29
realloc()って新たに確保した場所にそれ以前のものをコピーするんじゃなかったっけ?
毎回やっているかは知らんが
902:デフォルトの名無しさん
07/09/16 15:06:55
>>901
元の領域に連続した領域を確保できれば、単純な拡張でよいので、
コピーは省略出来る。
903:デフォルトの名無しさん
07/09/16 15:09:04
>>901
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
void *ptr=NULL, *new_ptr;
int i, count=0;
for(i=1;i<=1000;i++){
new_ptr=realloc(ptr, i*100);
if(ptr!=new_ptr){
fprintf(stderr, "pointer changed. [%d]\n", i);
ptr=new_ptr;
count++;
}
}
printf("change count : %d\n", count);
free(ptr);
return 0;
}
904:デフォルトの名無しさん
07/09/16 18:10:12
巨大な配列を宣言時に同じ値で初期化したいんですけどこういう場合に簡略化する書き方とかないですかね
void func()
{
static int array[3000] = { 0, .. ,0};
}
的な…
905:デフォルトの名無しさん
07/09/16 18:20:31
{0}
っていうかstaticって自動的に0で初期化されなかったっけ?
906:デフォルトの名無しさん
07/09/16 18:33:31
サンクス。うまくいきますた。
907:デフォルトの名無しさん
07/09/16 18:43:25
グローバル変数、静的変数は宣言時に全ての要素が 0 で初期化される。
ローカルな配列は、宣言時に1つ(1要素)でも初期化を行うと残りが全て 0 で初期化される。
int a[3000]; // a[0]~a[2999] まで全て 0
int b[3000] = {1, 2, 3}; // b[0]=1, b[1]=2, b[2]=3, b[3]~b[2999]=0
int c[3000] = {1}; // c[0]=1, c[1]~c[2999]=0
main(){
int d[3000]; // d[0]~d[2999] まで全て不定値(適当な値)
static int e[3000]; // a と同じ
int f[3000] = {1, 2}; // bとかcと同じ
}
よく、ローカルな配列を 0 で初期化するために array[256] = {0}; とか書くが、
1要素でも初期化すると残りが 0 で初期化されることを利用しているだけ。
array[256] = {1}; と書いて全ての要素が 1 で初期化されると誤解するやつが多い。
任意の値で初期化させたければ、n次元の配列はn重のループを普通に書く。
C++ならalgorithmのfillなんかを使えばいい。
908:デフォルトの名無しさん
07/09/16 20:37:21
>>904
staticなら自動的に0で初期化される。
関数内staticにするなら、他の値は難しいな。
呼び出しの都度初期化でいいならmemsetとかでも良いだろうけど。
909:デフォルトの名無しさん
07/09/16 20:39:25
複数ファイルにソースを書くときのお作法を知りたいんだけど、わかりやすいところないかな
910:デフォルトの名無しさん
07/09/17 01:00:33
>>909
ヘッダファイルから書き始める
911:デフォルトの名無しさん
07/09/17 02:30:43
新しくコード書くとき
既存のファイルに加えるか
新しくファイル作成するか迷うんだけど
どういう基準でやったらいいですか?
912:デフォルトの名無しさん
07/09/17 10:25:01
設計上モジュールが分かれてたらファイルを分ける。
CUnit使うなら1ファイルに1関数。
913: ◆7qRx8xrwgo
07/09/17 11:51:39
質問させていただきます。
円記号を表示します。 :\
アポストロフィを表示します。:\
と、出力したくて
#include <stdio.h>
int main(void)
{
printf("円記号を表示します。 :%c\n", '\\');
printf("アポストロフィを表示します。:%c\n", '\'');
return 0;
}
でコンパイルしてみたのですが、
Sample5.c:5:12: warning: unknown escape sequence: '\216'
Sample5.c:6:12: warning: unknown escape sequence: '\216'
とエラーが出たのですが、どうすればエラーが表示されなくなりますか?
914:デフォルトの名無しさん
07/09/17 11:53:04
>>913
表示
↓
出力
915:デフォルトの名無しさん
07/09/17 11:55:23
「表」の後ろに¥を入れれば直るかも。
916:デフォルトの名無しさん
07/09/17 11:59:13
OSとコンパイラは何?
917:デフォルトの名無しさん
07/09/17 12:03:44
>>913
文字コード Shift-Jis の時
[表示] = 0x95 0x5C 0x8E 0xA6
0x5C = '\\'
0x8E = 0216 <- 8進数
\216 を解釈しようとして、そんなエスケープシーケンスがないという
*警告*がでているだけ
日本語対応しているコンパイラを使うほうが楽
918:913 ◆7qRx8xrwgo
07/09/17 12:16:57
>>914
本に表示と書いてありました
>>915
失礼ながら半信半疑で試したところ、仰るとおり直りました。
>>916
OS:Wndows XP HE SP2
コンパイラ: gcc(Cygwin)
>>917
解説ありがとうございます。今はコンパイラを変えたくないのでこのままでいこうと思います。
もしよろしければ、「表示」のように、気をつけた方がいい単語が他にもありましたら教えてください。
919:デフォルトの名無しさん
07/09/17 12:22:35
>>918
―ソЫⅨ噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿杤歃
920:デフォルトの名無しさん
07/09/17 12:26:19
gcc に --input-charset=cp932 --exec-charset=cp932 オプションをつけてみ
921:デフォルトの名無しさん
07/09/17 12:32:32
>>920 thx
MinGW (GCC.EXE (GCC) 3.4.2 (mingw-special)) でもいけたよ
さっそく CFLAGS に追加しておいた
922:918 ◆7qRx8xrwgo
07/09/17 12:36:56
>>920
仰るとおりに実行した所エラーが表示されることも無くコンパイルできました。感謝です。
923:デフォルトの名無しさん
07/09/17 12:41:51
皆さん、実際にC言語でどのようなソフトを書かれているんですか?
924:デフォルトの名無しさん
07/09/17 12:51:00
OS書いていますけど?
925:デフォルトの名無しさん
07/09/17 12:53:14
通信プロトコル。
OSIでデータリンクからセッションぐらいまで
926:デフォルトの名無しさん
07/09/17 12:55:28
どこにもしようしているおえすめいかいてない
あおえすをしいでかいてるのか
すごいなおまえ
927:デフォルトの名無しさん
07/09/17 13:01:33
C言語は学校の授業や課題でしか使わんな
普段使うのはVC++かJavaかC#
928:デフォルトの名無しさん
07/09/17 14:43:27
>>923
去年、一年くらい、10年くらい前に作られたシステムの保守要員やらされて、辟易した。
929:デフォルトの名無しさん
07/09/17 16:20:36
保守ってどんなことやるの?
930:デフォルトの名無しさん
07/09/17 16:40:25
>>929
お客さんとこのシステムの構成が変わったりなんか要望があったら、それにあわせてコードを書き換えたりとか。
新規のお客さんもあったけど、すでにあるコードから必要なコードをコピペして、ちょっといじって
もって行ったりとかするだけ。
931:デフォルトの名無しさん
07/09/17 16:45:13
ものすごくつまんなそうな仕事ですね
932:デフォルトの名無しさん
07/09/17 16:57:41
つまらないうえに、すごいつらかった。
基本的にソースコードぐちゃぐちゃだし。
933:デフォルトの名無しさん
07/09/17 17:06:15
今の現場、つまらないうえに、すごいつらい。
基本的にソースぐちゃぐちゃだし。
934:デフォルトの名無しさん
07/09/17 18:32:30
既存のファイルのファイルスコープにある変数や関数を使いたい、
っていうんじゃないんだろうから、迷ったら別ファイルでいいんじゃないでしょうか?
ファイルを分ける弊害って、なにかあるでしょうか?
935:934
07/09/17 18:35:31
リロードわすれてたっはっは~
936:デフォルトの名無しさん
07/09/17 21:35:29
>>933
でも、大事な仕事だよ。
今後はC言語でも保守の仕事が増えるんじゃないか!?
COBOLはすでにそうなっている。
しっかりとしたコーディング規約があって、その通りに作られていればいいんだが、
Cでの開発プロジェクトにはコーディング規約がないくて、各自各様のスタイルでコーディング
していることが多い。最近はそうでもないかもしれないけどね。
937:933
07/09/17 22:09:47
>>934は>>911に対するレス?
>>936
スタイル云々以前の問題でね、多分プログラミング自体の経験が無い人か、
少なくとも、スコープを分かってない人が書いたプログラムで、それが原因のバグとかもある。
おそらくテストもマトモにしてないと思われるよ。orz
>>911
で、「分ける分けない」て話は、スコープとも関わる話なのでスコープを理解すること。
関連性が強い物、似たような機能のものを集めるという分け方もある。
「モジュール強度 結合度 独立性」という言葉を調べると何かわかるかも。
938:デフォルトの名無しさん
07/09/17 22:18:54
>>937
「モジュール強度 結合度 独立性」
なつかしい言葉だね
939:デフォルトの名無しさん
07/09/18 01:53:17
何方か、標準関数とポインタ変数についてを詳しく教えてくださる方はいらっしゃいますか?
自分が持ったいた参考書がこの2つの内容が掲載されてた部分が破けていて分からなくて困っています^^;
940:デフォルトの名無しさん
07/09/18 02:00:19
>>939
ポインタ
URLリンク(www.geocities.jp)
標準関数
URLリンク(always-pg.com)
941:デフォルトの名無しさん
07/09/18 02:05:59
940>有難う御座います
942:デフォルトの名無しさん
07/09/18 02:07:38
>>940
>「&」をアドレス演算子といいます。「&」がアドレスを表すので「"アンド"レス」と覚えておくと分かりやすいかも知れません。
なごんだ(´ー`)
943:デフォルトの名無しさん
07/09/18 02:10:59
今更Cなんて初めて使う機会ないよ
OSやドライバを作るなら必要だが、そのレベルに達するまで恐らく5年以上は掛かるだろう
944:デフォルトの名無しさん
07/09/18 02:13:02
がんばれば30日でできるらしいぞ
945:デフォルトの名無しさん
07/09/18 02:14:40
あれかw
946:デフォルトの名無しさん
07/09/18 02:23:30
C言語の言うことなら何でも聞きます
947:デフォルトの名無しさん
07/09/18 02:58:03
URLリンク(always-pg.com)
こちらの「文字列の文字数を求める」サンプルプログラムですが、
"Cプログラム" の長さは 6 が返るはずなんですが 11 が返ります。
なぜでしょうか? 環境は、linuxで gcc 3.3.6 です。
948:デフォルトの名無しさん
07/09/18 03:01:06
全角は2文字
949:デフォルトの名無しさん
07/09/18 03:26:23
ちょっと語弊を招きかねない回答だなw
全角文字は2バイトなのでC標準のstrlenのようにバイト数を返す関数を使用した場合、文字数が得られるとは限らない。
ちゃんとロケールを設定すれば6になるはずだが?一字一句間違えずにコピペした?
950:デフォルトの名無しさん
07/09/18 03:31:49
>>949
ダウンロードして展開した wcslen.c というファイルを euc-jp-unix にしてから
そのままコンパイルして実行してます。
951:デフォルトの名無しさん
07/09/18 03:58:59
>>947-950
試してみたが、VC++では 6 が返ってきた。
cygwin gcc 3.4.4 ではコンパイルできなかった。
L"Cプログラム"; の L でパースエラー。
952:デフォルトの名無しさん
07/09/18 04:14:27
え?ってかCなの?C++じゃなくて?
C標準に2バイト文字なんて概念あったっけ?
953:デフォルトの名無しさん
07/09/18 04:22:59
wchat_t
954:デフォルトの名無しさん
07/09/18 07:52:09
質問させてくださりませ。
void parse_long_options (int _argc,
char **_argv,
const char *_command_name,
...);
の中の"..."の点三つはどういう意味なのでしょうか?
ご教授宜しくお願い致します。
955:デフォルトの名無しさん
07/09/18 08:01:23
>>954
教授じゃなくて教示な
URLリンク(www.geocities.jp)
956:デフォルトの名無しさん
07/09/18 08:30:14
引数の数が可変であるってこと。