【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/
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でばっちり動作しました。
0449デフォルトの名無しさん
2006/09/14(木) 23:30:05まず、やりたいことを日本語で詳しく書いてみたらどうだろう?
読みたいファイルのサイズも含めて。
0450429
2006/09/14(木) 23:40:10はい。すみません。
ファイル名 file.name
作者:ねずみ講
猫がねこんだアナコンダ
あめんぼあかいなあいうえお
空と君との間には
紫の薔薇の人
・・・
とまぁ、こんな感じのファイルを
最初の先頭行(作者)の行以外を別の配列にセットして
出力したいのです。
0451デフォルトの名無しさん
2006/09/15(金) 02:23:01#include <stdio.h>
int main(){
int i=-1;
int *ip = &i;
unsigned int *ip2 = (unsigned int *)ip;
printf("i = %d\n",i);
printf("*ip = %d\n",*ip);
printf("*ip2 = %d\n",*ip2);
if (*ip2 > 0) printf("*ip2 は正です");
return 0;
}
と書いて実行してみたら
i = -1
*ip = -1
*ip2 = -1
*ip2 は正です
となってしまったのですが、*ip2 は正と負、どちらなんでしょうか?
0452デフォルトの名無しさん
2006/09/15(金) 02:43:42printfの書式指定の中で %d とやっているが、これは int用の指定。
unsigned用にするには %uとしなければならない。
そしてunsignedなんだから、0でなければ必ず正。
0453451
2006/09/15(金) 02:59:38%uというのがあったんですね、ありがとうございます
*ip2は正で、iは負のままだから、*で参照される度にiがunsigned intにキャストされてるってことなんですね
0454デフォルトの名無しさん
2006/09/15(金) 03:10:09正確には解釈が微妙に間違っているのだが・・・・まあそれでいいだろ。
勉強を進めていくうちに別な見方にも気づく事だろう。
0455デフォルトの名無しさん
2006/09/15(金) 03:26:54ありゃ微妙に違うんですか…精進します
0456デフォルトの名無しさん
2006/09/15(金) 03:38:000457デフォルトの名無しさん
2006/09/15(金) 04:25:55> 今回のテーマであるNULLですが、このマクロで表される空ポインタ定数というのは、実は関数へのポインタには代入することができません。
これマジ?
0458デフォルトの名無しさん
2006/09/15(金) 16:32:58errno=29(ESPIPE)が設定されてしまいます。気にしなくていいのでしょうか。
open()&lseek()使った方がいいですか?
その後ファイルへの書き込みはできます。
errno=0;
printf("%s:%d:errno[%d]\n", __FILE__, __LINE__, errno);
fp = fopen(filename, "ab");
printf("%s:%d:errno[%d]\n", __FILE__, __LINE__, errno);
0459458
2006/09/15(金) 16:52:27>プログラムがerrnoの中身を調べることは、エラーが報告されたときだけ意味があることに注意
0460デフォルトの名無しさん
2006/09/15(金) 22:07:02プログラムを実行し、ファイルを読みとるため、
データファイル名を入力するとき、入力補完機能をつけるにはどうすればよいのでようか?
長いファイル名をイチイチうつのが面倒なのですが
UNIX環境みたいにscanfで文字を入力する際に補完とかできないかと思いまして
0461デフォルトの名無しさん
2006/09/15(金) 22:17:36まあ補完機能の部分だけなら別に読む必要も無いだろうが。
0462デフォルトの名無しさん
2006/09/16(土) 00:59:370463デフォルトの名無しさん
2006/09/16(土) 02:30:08つうか厳密には比較もダメみたいに書いてあるね
今まで
if(f!=NULL){
f();
}
とかさんざんやってきたんだけど・・・
0464デフォルトの名無しさん
2006/09/16(土) 03:55:35いや、比較は大丈夫らしいぞ。
それで代入がダメってのは、なんかおかしい気がするが。
0465デフォルトの名無しさん
2006/09/16(土) 16:13:090とNULLポインタを比較すると真になる。
http://www.kouno.jp/home/c_faq/c5.html#2
0466デフォルトの名無しさん
2006/09/16(土) 21:16:00条件
AさんとBさんがいます。AさんとBさんは通信ができます。
AさんとBさんが通信を開始し、終了すると、その間の記録がログファイルとして
記録されます。
通信の開始は、キーボードからスタートと入力することにより開始されます。
終了は、キーボードからエンドと入力することにより、開始されます。
言語はC++。コンパイラはVisual C++
要求
通信を自動的に1時間ごと切り、1時間ごとのログファイルを作成したい。
よろしくお願いいたします。
0467デフォルトの名無しさん
2006/09/16(土) 21:16:140468デフォルトの名無しさん
2006/09/16(土) 21:20:06ミ ∠_)
/
/ \\
ウイーン Γ/了 | |
ウイーン |.@| | | ガッガッガッ
| / | . 人
|/ | < >_Λ∩
_/ | //. V`Д´)/←>>467
(_フ彡 /
■ このスレッドは過去ログ倉庫に格納されています