【ANSI-C】 C言語なら俺に聞け! Part 129
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/08/27(日) 15:43:44まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/250-7563469-9920244
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレ
【ANSI-C】 C言語なら俺に聞け! Part 128
http://pc8.2ch.net/test/read.cgi/tech/1151282084/
GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は
専門の別スレッド↓があるのでそこへさようなら。
【初心者歓迎】C/C++室 Ver.30【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1156145524/
C/C++の宿題を片付けます 73代目
http://pc8.2ch.net/test/read.cgi/tech/1155355501/
新・推薦図書/必読図書のためのスレッド 1
http://pc8.2ch.net/test/read.cgi/prog/1146889623/
0348デフォルトの名無しさん
2006/09/12(火) 01:50:48確かに気になるな;
0349デフォルトの名無しさん
2006/09/12(火) 02:03:500350デフォルトの名無しさん
2006/09/12(火) 12:55:02最小限のプログラムを書いたのですが、やはり警告が出ます。
---ソース---
#include <stdio.h>
#include <stdlib.h>
int main(void){
int c_int = 0;
char c_char[] = "1234";
c_int = atoi(c_char);
printf("%d\n",c_int);
return 0;
}
---警告の内容---
警告 W8004 atoitest.c 5: 'c_int' に代入した値は使われていない(関数 main )
この警告はどうやったら無くなるのでしょうか?
変数c_intがprintfにしか使用されない場合、この警告を気にしなくとも良いのでしょうか?
よろしくお願いします。
せっかく行番号出てるのにどうしてそこを見ないのか…
ゼロで初期化しているがその値が使われる前にc_intに上書きされているっつー警告。
0352デフォルトの名無しさん
2006/09/13(水) 01:48:29sprintf(aa, "abcdefghijklmn");
なんて書いた場合aaの中身はabcdefghijklmnになるんですけど、これってsprintfが適切にメモリ確保してるって事ですか?
0353デフォルトの名無しさん
2006/09/13(水) 01:51:35いいえ。未定義動作です。
そしてバッファオーバーフローと呼ばれるバグです。
0354デフォルトの名無しさん
2006/09/13(水) 01:52:23「偶然」そうなっただけ
0356デフォルトの名無しさん
2006/09/13(水) 02:51:48Cで使うOO風のライブラリってありませんか?
String *str = new_String("abc");
str->add("def");
みたいに書きたいんです。文字列の処理はString.hを見ればわかるっていう感じで
楽がしたいんです。Cではグローバルな関数群から目的のモノを探すだけで時間がかかります。
客(Solaris8)にコンパイルしてもらわなきゃいけないので、
大きくてトラブル対応できないライブラリは不可です。
見あたらなかったんでlinkMapとかloggerとか自分で作ってみたのですが、めんどくさく
なってきました。存在しないなら自作の奴をさらすので意見して欲しいなあと
思ってるんですがいかがでしょうか
0357デフォルトの名無しさん
2006/09/13(水) 04:34:11で、>>356さんと似たようなことを感じてます。
若輩者ゆえ役立つコメントなどできませぬが、「自作のやつ」をさらして欲しいです。
0358デフォルトの名無しさん
2006/09/13(水) 04:36:03Cのあのベニヤ板に貼り付けたような平面的なプログラムが見にくくて
たまらない。
0359デフォルトの名無しさん
2006/09/13(水) 05:28:19郷に入れば郷に従え。
strcatでいいじゃん。
0360デフォルトの名無しさん
2006/09/13(水) 05:36:38単にJavaから入って、それ以外への適応能力が不足しているだけじゃん。
0361デフォルトの名無しさん
2006/09/13(水) 06:14:22よくわかんないけど、コンテナが欲しいの?
ググれば腐るほどあるでしょ。
0362デフォルトの名無しさん
2006/09/13(水) 06:57:19今自作しちゃえば、次の仕事の時に多少汎用なコードが残ることになるぞ
とか唆してみるテストw
0363356
2006/09/13(水) 08:29:31c++で無理矢理Java風に書くのとかは嫌い。でも非OOで書くのはもうキツイ。
複数のインスタンスが生成できるコンテナあるのなら教えて。正直ググったけど
Hashtableのサンプルくらいしか見つからなかった。
Cで仕事することはもうほとんどないし、自作ライブラリよりもちゃんとメンテナの
いるライブラリを利用する方が効率いいからなあと思ったんだけど、
ちょっと別スレ建ててみますわ。まあスレが伸びなきゃ伸びないで終了ということで
0364デフォルトの名無しさん
2006/09/13(水) 08:35:42>複数のインスタンスが生成できるコンテナあるのなら教えて。正直ググったけど
>Hashtableのサンプルくらいしか見つからなかった。
プログラミング能力(基礎力)が決定的に不足してるな。
>ちょっと別スレ建ててみますわ。まあスレが伸びなきゃ伸びないで終了ということで
糞スレ立てんな。
0365デフォルトの名無しさん
2006/09/13(水) 08:54:400366デフォルトの名無しさん
2006/09/13(水) 09:01:580367デフォルトの名無しさん
2006/09/13(水) 09:45:51お前、嘘ついてまで甘えるなよ
0368350
2006/09/13(水) 10:05:29ありがとうございます。初期化が無駄だって事ですね。
ちなみに最小限のプログラムを書く前の、元のプログラムでは
"}"の消し忘れという更にorzな理由でエラーが出てました。
0369デフォルトの名無しさん
2006/09/13(水) 10:09:23#define A #include "aiueo.h"
そもそもこんなことっておk?
0370デフォルトの名無しさん
2006/09/13(水) 10:10:28ちょっとだけCが必要になったからといって、そういうつまんねーウソついてばかりで
お前は相当嫌われてるんだろうな。
それもこのスレで聞いているし、お前相当バカだ。
そしてお前らもこういうウソぐらい見抜けよな。
ネタ以下なのにいつまでも気がつかないから、お前らカモられてるんじゃねーのか?
ケケケ
0371デフォルトの名無しさん
2006/09/13(水) 10:10:54それは本当に初心の頃なら誰でも辿る道だ。
キニスンナ
プログラマはバグを出して大きくなるのさ。w
0372デフォルトの名無しさん
2006/09/13(水) 10:18:52たとえば「c コンテナ ライブラリ」でググるとC++のライブラリばかり。
もし有用なサイトを知っているならURLだけでも教えてください。
このスレに聞いたのはCのライブラリ知ってる人がいると思ったから。
俺最初は「Cのライブラリありませんか?」って質問しにきたんだけど、
元発言読んでる?
今Java使いなのはその通りだけど、10年以上前はHP-UX上で
Motif使ったCプログラム書いてたよ。1年くらいでC++に行ったし、
当時はぺーぺーだったからC使いとは言えない感じだけど。
C++ではStringとかコンテナの汎用ライブラリを使ってた。
0373デフォルトの名無しさん
2006/09/13(水) 10:21:40オレには、文系で口が上手い奴に見える。
Javaしか使えなくて、Cは教養程度しか知らないんだろうよ。
setjmp.hとか知らなそうだ。
0374デフォルトの名無しさん
2006/09/13(水) 10:57:42と
自分で作った奴が既にある
という矛盾。
自分で作ったならそれ使えばいいじゃん。
0375デフォルトの名無しさん
2006/09/13(水) 11:48:01お前もかなりのステレオタイプである事が推察されるw
0376デフォルトの名無しさん
2006/09/13(水) 11:53:16[今さら]C言語でクラスライブラリを作る[Cかよ]
http://pc8.2ch.net/test/read.cgi/tech/1158108311/
0377デフォルトの名無しさん
2006/09/13(水) 13:19:36void test(char *data2){
*data2++;
printf("addres_2:%d\n", data2);
};
int main(){
char data[10] = "zxcvbnm";
printf("addres_1:%d\n", data);
test(data);
printf("addres_3:%d\n", data);
return 0;
};
実行した後、addres_2とaddres_3の値が一緒になると思っていたらaddres_1とaddres_3の値が同じになってしまいました。関数内のポインタ加算は初期化されるのでしょうか?それとも関数のdata2はdataと別物?なのでしょうか?
0378デフォルトの名無しさん
2006/09/13(水) 13:39:53char c = ''';
とするとエラーが出るのですが、他に方法があるのでしょうか?
0379デフォルトの名無しさん
2006/09/13(水) 13:41:34char c = '\'';
0380デフォルトの名無しさん
2006/09/13(水) 14:11:09ポインタ表示したいなら、%p指定すべき
引数に渡した時点で、指している場所は同じだが別物
関数内でどうしてもポインタを加算したいなら、
戻り値で加算後のポインタを返せばよい
0381デフォルトの名無しさん
2006/09/13(水) 14:29:35>*data2++;
がおかしい。
ツッコミどころ多すぎ。
>void test(char *data2){
ここで渡される引数data2をいくらいじろうとも、呼び出し元のdataには何の影響もない。
>*data2++;
しかも、これはdata2に対する操作ではない。
mainの最後に printf("%s\n",data);を入れてみると何が悪いのか分かるはず。
>char data[10] = "zxcvbnm";
呼び出し先でポインタをいじるのに配列渡しちゃダメ。
0383377
2006/09/13(水) 16:18:32ポインタに限らず引数は「初期値がセットしてあるかもしれないローカル変数」なんですよね。
addres_2を変更してもaddres_3が変わらないのは当たり前でした。
別のソースではtest関数でdataの内容をポインタでアクセスして変更してた(できてた)のが混乱の元でした…。
>>380-382
ご指摘ありがとうございました。
0384デフォルトの名無しさん
2006/09/13(水) 16:39:53(0xFFFFFFFF ^ Z) + 1 (この演算に限っては 1 + ~Z でもかまわない)
の演算を実行すれば -Z と解釈されますか?
プログラムを実行した結果 -32768 を除き正しい事は確かめられたのですが、考え方は間違ってませんよね?
どこかの教科書に ^Z + 1 のことについて書かれていたので初めは混乱したのですが。
0385デフォルトの名無しさん
2006/09/13(水) 17:06:22何故わざわざunsignedを取り扱うのかというのは
自分が使っているツールの処理系に依存しているからです。
unsigned charだと、Cの関数であるstrcmpやstrcpyが使用できません。
やり方が全く思い浮かばず困っています。どうかご教授お願いしますm(_ _)m。
0386デフォルトの名無しさん
2006/09/13(水) 17:07:040387デフォルトの名無しさん
2006/09/13(水) 18:25:530388デフォルトの名無しさん
2006/09/13(水) 18:26:43#Warning 6: value of expression is not used
試しに(includeとかmainは表記省略)
unsigned char a[] = "てすと";
a = (char)a;
とやってみたらエラーが出ました・・・
charのキャストは出来ないっぽいです。
0389デフォルトの名無しさん
2006/09/13(水) 18:28:14特に条件はなく、どんな方法でもいいのでやり方教えて下さいm(_ _)m
0390デフォルトの名無しさん
2006/09/13(水) 18:29:450391デフォルトの名無しさん
2006/09/13(水) 18:32:02char a[];
unsigned char b[] = "てすと";
a = (char)b;
と書くつもりでした。(できないのは同じ事です)
0392デフォルトの名無しさん
2006/09/13(水) 18:32:38unsigned char a[] = "てすと";
char *b;
b = (char *)a;
0393デフォルトの名無しさん
2006/09/13(水) 18:34:06unsigned char b[] = "てすと";
a = (char*)b;
0394デフォルトの名無しさん
2006/09/13(水) 18:34:30unsigned char *str = "hello" ;
signed char *pstr ;
pstr = (signed char *) str ;
それと使えないのではなくて警告が出るだけではないのですか?
0395デフォルトの名無しさん
2006/09/13(水) 18:34:41その場合もaは変数じゃなくて定数だってば。
Javaじゃないんだから。
0396デフォルトの名無しさん
2006/09/13(水) 18:34:47ゴミレスすまそ。
0397デフォルトの名無しさん
2006/09/13(水) 18:39:440398デフォルトの名無しさん
2006/09/13(水) 18:41:530399デフォルトの名無しさん
2006/09/13(水) 18:44:16ずっとこの事が分からなくてスランプに陥ってましたが
皆さんのおかげでやっと解決しました!(^_^)/
キャストの際ポインターをつけたらちゃんと出来ました!
このやり方だとエラーも警告も出ませんでした。
本当に有り難うございましたm(_ _)m!
0400デフォルトの名無しさん
2006/09/13(水) 18:49:43実際には char a[] = "てす";
と書いていたのですが、テンパって省略してしまったのでw
*と[]は違うのはある程度知っていましたが、ポインターを勉強し直した方がいいというのは事実です・・・
なんにせよ、本当になんとお礼を言っていいのかm(_ _)m!
0401デフォルトの名無しさん
2006/09/13(水) 19:23:10(実際は、何十万文字あるとして)
改行をなくして、1行にして、
X文字目からY文字目までの文字列を、そのつどXとYを入力して文字列を取り出すには、
どの関数を使えばよいのでしょうか?
TIAUAOTUAOITUAOITAOTUAOTUATUAO
TOAUTOAITUAOTUAOSITUAOTUAOITUA
AOTUAOTUAOTUAOTUAOTUAOTUAOTUAO
TYOAUTOATUAOTUAOTUAOTUAOTUAOTA
0402デフォルトの名無しさん
2006/09/13(水) 19:26:22fopen()
fgets()
strlen()
printf() or putc()
0403デフォルトの名無しさん
2006/09/13(水) 19:57:38お前もツッコミどころ多すぎ。
0404デフォルトの名無しさん
2006/09/13(水) 20:00:40まじでそれでいけますか?
for文使うやつって、凄いなんか処理重くなりそうと思ったんす
つまり、XとYの長さをstlenで測って それを
substrなりするのかな
改行はfgetsできえましたか?
0405デフォルトの名無しさん
2006/09/13(水) 20:07:33行の長さが固定長なら、fseekでいける。
> 改行はfgetsできえましたか?
試すかマニュアル読めよ。
0406デフォルトの名無しさん
2006/09/13(水) 20:07:521行ずつ読み込んでから、1つに連結していけばよい。
あと、重いかどうかは、創造する前にまず試してみろ。
案外率直な方法でも気にするほど遅くなかったりその逆だったりすることは良くあることだ。
0407404
2006/09/13(水) 20:19:19しかし、何十万、何百万文字を1行にして
charで保存できましたっけ
とりあえず、strcatで連結して
1行で出力してそこを、x〜yまで抽出して
charに格納かな。
0408デフォルトの名無しさん
2006/09/13(水) 20:22:58いやいや、Xを超えるまでは読み捨て。
Xを超えたら、そこから連結しながらX+Yを超えるまで読み込む。
0409デフォルトの名無しさん
2006/09/13(水) 22:03:57まぁ読んでは捨ててを繰り返したほうが効率いいだろうけどさ。
0410デフォルトの名無しさん
2006/09/13(水) 22:14:290411デフォルトの名無しさん
2006/09/14(木) 00:33:41#include <stdio.h>
main()
{
PRINTF(文字);
}
として、
->文字<-
と表示されることを期待したのですが、だめでした。
#defineの部分を直せば、こういうことできますか?
0412デフォルトの名無しさん
2006/09/14(木) 00:46:410413デフォルトの名無しさん
2006/09/14(木) 01:06:58ありがとうございました。できました!
0414デフォルトの名無しさん
2006/09/14(木) 07:35:02「文字」に \ や不正な文字が混ざるとまずい事になるから、普通にダブルクォート使え。
#define PRINTF(MOJI) printf("->" MOJI "<-\n")
PRINTF("文字")
0415デフォルトの名無しさん
2006/09/14(木) 09:14:17scanf()系の関数やgetche()ではうまくいきませんでした。
これは環境依存になってしまうのでしょうか?
0416デフォルトの名無しさん
2006/09/14(木) 09:18:47コンソールの中でカーソル位置を任意に動かすのは多分環境依存
行頭に復帰させるだけなら \r で出来るかどうか忘れた
0417デフォルトの名無しさん
2006/09/14(木) 10:40:08標準 C ではコンソールの概念が無いのでカーソルキーを監視することは出来ない。
あと getche() は非標準。
>>416
「カーソル位置を任意に動かす」とはどこにも書いてない。
0418デフォルトの名無しさん
2006/09/14(木) 10:41:50とほざいてみる。
0419デフォルトの名無しさん
2006/09/14(木) 17:22:02http://msdn2.microsoft.com/ja-JP/library/kswce429.aspx
http://msdn2.microsoft.com/ja-JP/library/078sfkak.aspx
こんなの書いてあった。やったことは無いけど二回呼ぶらしい。
ところでカーソルキーを読んでそのあと何しようとしてたの?
読んで終わりってことは無いと思うけど、カーソルの点滅位置
を動かしたかったの?
0420デフォルトの名無しさん
2006/09/14(木) 19:21:46そこから、100〜200、10万〜1億とか 70億から70億1000文字
取り出すにはどうすればよいのでしょうか?
char array[10000000000]
なんてできませんよね
それに、100〜200とかしか取り出さないのなら、10000000000も領域確保する
必要がない気もするのですが
どうすれば効率的になるのでしょうか?
1000000000領域確保したとして、すぐに消さばいいのかな
0421デフォルトの名無しさん
2006/09/14(木) 19:28:00でもたぶん、中にあるほうのファイルは通常のファイルとして扱っていいでしょう。
0422420
2006/09/14(木) 19:29:150423デフォルトの名無しさん
2006/09/14(木) 19:32:51そういうときは必要な一部を読み込んで処理すればいいです。
最初から順番に処理するような場合も、最初からちょっとづつメモリに読んで
処理するのがいいでしょう。
メモリマップド+仮想記憶のような仕組みを使うときはメモリを確保したかのよな
処理の仕方も可能です。
0424デフォルトの名無しさん
2006/09/14(木) 19:37:56fseekでぐぐって末吉
0425デフォルトの名無しさん
2006/09/14(木) 19:40:55単なるテキストファイルと見ても、
最低10GBのサイズになるわけだが。
チェックしなきゃいかんなら、
先頭から順番に一定範囲だけ読んで、
そこに開始条件を満たすものがなければ読み捨てて次、と
繰り返せば良し。
単に位置しかみないなら、開いてからそこまでseekして、
目的の位置から終了位置まで別ファイルに切り出すとか。
コード自体はごく単純に済ませることが可能。
0426420
2006/09/14(木) 20:25:29必要な範囲だけのこすにしても
とりあえず100億文字なら100億文字の配列を最初に確保しなきゃいけないのですよね
20億〜30億文字や10億〜15億文字 70億〜80億文字と任意の間を読むにしろ
この最初に確保する配列を任意の文字にできないのでしょうか?
開始条件が位置なので、fseekでも最初に膨大な配列のメモリ領域を確保しないといけませんよね
0427デフォルトの名無しさん
2006/09/14(木) 20:38:18まずそれから考えてみろ
0428_
2006/09/14(木) 20:44:45ページング
0429デフォルトの名無しさん
2006/09/14(木) 20:55:51最初の1行はスルーする もしくは、 ? など特定の文字が先頭にある行を
スルーするときは、
どうすればよいのでしょうか?
if文でしょうか?
0430デフォルトの名無しさん
2006/09/14(木) 20:55:58知ったかぶりしたいだけのバカ
0431デフォルトの名無しさん
2006/09/14(木) 20:58:28俺は>>428向けに書いたんだ。
ページングで物理メモリの不足は補えるけど
アドレス空間の不足はどうしようもないんだよ。
だから、64bitという話が出てくる。
>>429
読んでから確かめるしかないでしょ。
最初の一文字なりで簡単に判定出来るじゃん。
0432デフォルトの名無しさん
2006/09/14(木) 21:05:21>fseekでも最初に膨大な配列のメモリ領域を確保しないといけませんよね
・そのファイルがテキストファイルかどうか
・文字コードは何か
・改行コードは何か
・「何文字目」は文字単位なのかバイト単位なのか
によって変わるが、それにしたって
読み飛ばした分全部覚えておく必要なんかないだろうに。
0433デフォルトの名無しさん
2006/09/14(木) 21:07:56メモリだけがアドレス空間を使用してるわけでもないし
0434429
2006/09/14(木) 21:20:20{
if( string[0] != ?){
sscanf(string,%c,mojikakunou)
}
}
こんな感じで判定でしょうか?
0435デフォルトの名無しさん
2006/09/14(木) 21:24:58考え方としてはそんな感じでいいんじゃないか。
0436429
2006/09/14(木) 21:29:331行目だけ違うとこに格納みたいなことかな
しかし1行目の判定はどこですれば
0437デフォルトの名無しさん
2006/09/14(木) 21:38:41違うの?
0439デフォルトの名無しさん
2006/09/14(木) 21:43:18本当に「最初の一行」で良いなら
ループに入る前に空読みすりゃ良いし。
まあファイル中で特定の行が現れた次の行ってなら
フラグ使うか、ifの内部でもう一度読むとかで
多少面倒にはなるが。
0440429
2006/09/14(木) 21:54:25fegets( string 20 fp)
while(fgets(string 20 fp)
{
}
こんな感じかな・・・
0441デフォルトの名無しさん
2006/09/14(木) 22:00:10釣りですか
0442デフォルトの名無しさん
2006/09/14(木) 22:02:48下のようなソースコードがあったんですけど、
少しだけいじって、SJISに対応させることはできませんか。
#define DIRSEP '\\'
...
filepart=strrchr(realfilename, DIRSEP);
0443デフォルトの名無しさん
2006/09/14(木) 22:04:590444デフォルトの名無しさん
2006/09/14(木) 22:10:080445デフォルトの名無しさん
2006/09/14(木) 22:14:53環境依存で、SJISの2byte目かを判定する関数が用意されているはず。
0446デフォルトの名無しさん
2006/09/14(木) 22:17:100447デフォルトの名無しさん
2006/09/14(木) 22:26:31ありがとうございます。
_mbsrchrでばっちり動作しました。
■ このスレッドは過去ログ倉庫に格納されています