От: | Разраб | ||
Дата: | 15.09.23 03:29 | ||
Оценка: |
//utils.rs
use std::io;
pub fn readln(prompt: &str) -> String {
println!("{}", prompt);
let mut input = String::new();
_ = io::stdin().read_line(&mut input);
return String::from(&input[..input.len() - 1]);// <- небольшой оверхед по-моему, ведь метод называется read_line ;-)
}
//main.rs
mod utils;// <- вот это мне показалось совсем не очевидно
struct Person {
name: String,
}
fn main() {
let name = utils::readln("What is your name?");
let person = Person {
name: String::from(name),
};
println!("Привет, {}!", person.name);
}
//utils.zig
const std = @import("std");
pub fn readln(prompt: []const u8) ![]u8 {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
const stdin = std.io.getStdIn();
std.debug.print("{s}", .{ prompt });
var input = std.ArrayList(u8).init(allocator);
defer input.deinit();
try stdin.reader().streamUntilDelimiter(input.writer(), '\n', 1024);
return input.items;
}
//main.zig
const std = @import("std");
const utils = @import("utils.zig");
const Person = struct {
name : []u8
};
pub fn main() !void {
var name = try utils.readln("What is your name?\n");
//defer name;
var person = Person { .name = name};
std.debug.print("Hello, {!}!", .{person});
}
Не смог найти хорошего примера именно функции для зиг, в то же время в раст как докуметация, так и помощь компилятора на высоте.Hello, main.Person{ .name = { Segmentation fault at address 0x7f793c7b7000
/snap/zig/8746/lib/std/fmt.zig:662:29: 0x264ce6 in formatType__anon_8745 (zello)
for (value, 0..) |elem, i| {
От: | Shmj | ||
Дата: | 15.09.23 04:25 | ||
Оценка: | 3 (1) |
От: | Shmj | ||
Дата: | 15.09.23 04:43 | ||
Оценка: |
От: | Разраб | ||
Дата: | 15.09.23 05:33 | ||
Оценка: |
От: | Разраб | ||
Дата: | 15.09.23 06:26 | ||
Оценка: |
module main;
import std.stdio;
import std.string;
string readline(string prompt)
{
write(prompt);
auto x = readln();
return x[0 .. $ - 1]; // <- что характерно, как и в расте нужно удалять символ новой строки
}
struct Person {
string name;
};
int main(string[] args)
{
auto name = readline("What is your name?\n");
auto person = Person(name);
writeln("Hello,",person.name,"!\n");
return 0;
}
var x: int; if x > 1 then x := 0 else x:= 1;
От: | Разраб | ||
Дата: | 15.09.23 07:08 | ||
Оценка: |
export module utils;
#include <iostream>
#include <string>
using namespace std;
export std::string readStringFromKeyboard(std:string prompt) {
std::cout << prompt;
std::string input;
std::getline(std::cin, input);
return input;
}
//clang -o output_file utils.cpp -std=c++20
gpt | |
ChatGPT & Midjourney | AI bot, [15.09.2023 14:06] Ошибка указывает на то, что в модуле utils объявлено пространство имён std, которое конфликтует с объявлением в стандартной библиотеке. Чтобы исправить эту ошибку, вам нужно удалить объявление пространства имён std из модуля utils. Вместо этого, вы можете явно указать использование пространства имён std для конкретных идентификаторов, например std::string: export module utils; #include <iostream> #include <string> export std::string readStringFromKeyboard(std::string prompt) { std::cout << prompt; std::string input; std::getline(std::cin, input); return input; } clang -o output_file utils.cpp -std=c++20 После этого, компилятор должен успешно скомпилировать модуль без ошибок. noname nobody, [15.09.2023 14:06] удалил объявление. ошибка осталась ChatGPT & Midjourney | AI bot, [15.09.2023 14:07] Если после удаления объявления пространства имён std ошибка осталась, то возможно проблема не связана с конфликтом имен. Возможные причины ошибки могут быть следующими: 1. Некорректное использование модулей в вашем коде. Убедитесь, что вы правильно импортируете и экспортируете модули в своем коде. 2. Неправильное использование компилятора. Убедитесь, что вы используете правильные флаги компиляции и указываете версию стандарта C++ (например, -std=c++20). 3. Проблемы с настройками компилятора или среды разработки. Проверьте настройки компилятора и убедитесь, что они правильно настроены для работы с модулями. Если проблема не решается, рекомендуется обратиться к документации компилятора или обратиться за помощью к сообществу разработчиков C++. | |
От: | gandjustas | http://blog.gandjustas.ru/ | |
Дата: | 15.09.23 07:18 | ||
Оценка: | +1 |
Р>Hello, main.Person{ .name = { Segmentation fault at address 0x7f793c7b7000
Р>/snap/zig/8746/lib/std/fmt.zig:662:29: 0x264ce6 in formatType__anon_8745 (zello)
Р> for (value, 0..) |elem, i| {
std.debug.print("Hello, {}!", .{person});
От: | Разраб | ||
Дата: | 15.09.23 09:49 | ||
Оценка: |
От: | gandjustas | http://blog.gandjustas.ru/ | |
Дата: | 15.09.23 12:13 | ||
Оценка: |
От: | Разраб | ||
Дата: | 15.09.23 14:05 | ||
Оценка: |
От: | Разраб | ||
Дата: | 16.09.23 04:20 | ||
Оценка: |
const std = @import("std");
pub fn readln(prompt: []const u8) ![]u8 {
const allocator: std.mem.Allocator = std.heap.page_allocator;
const stdin = std.io.getStdIn();
std.debug.print("{s}", .{ prompt });
var input = std.ArrayList(u8).init(allocator);
errdefer input.deinit(); // <- вот тут заменил простой дереф и аллокатор другой
try stdin.reader().streamUntilDelimiter(input.writer(), '\n', 1024);
return input.items;
}
От: | Shmj | ||
Дата: | 16.09.23 04:23 | ||
Оценка: |
От: | Shmj | ||
Дата: | 16.09.23 04:34 | ||
Оценка: |
Р>const std = @import("std");
Р>pub fn readln(prompt: []const u8) ![]u8 {
Р> const allocator: std.mem.Allocator = std.heap.page_allocator;
Р> const stdin = std.io.getStdIn();
Р> std.debug.print("{s}", .{ prompt });
Р> var input = std.ArrayList(u8).init(allocator);
Р> errdefer input.deinit(); // <- вот тут заменил простой дереф и аллокатор другой
Р> try stdin.reader().streamUntilDelimiter(input.writer(), '\n', 1024);
Р> return input.items;
Р>}
Р>
От: | Разраб | ||
Дата: | 16.09.23 05:12 | ||
Оценка: |
От: | Разраб | ||
Дата: | 16.09.23 06:10 | ||
Оценка: |
Ошибка указывает на то, что в модуле utils объявлено пространство имён std, которое конфликтует с объявлением в стандартной библиотеке.
Чтобы исправить эту ошибку, вам нужно удалить объявление пространства имён std из модуля utils. Вместо этого, вы можете явно указать использование пространства имён std для конкретных идентификаторов, например std::string:
export module utils;
#include <iostream>
#include <string>
export std::string readStringFromKeyboard(std::string prompt) {
std::cout << prompt;
std::string input;
std::getline(std::cin, input);
return input;
}
clang -o output_file utils.cpp -std=c++20
После этого, компилятор должен успешно скомпилировать модуль без ошибок.
От: | gandjustas | http://blog.gandjustas.ru/ | |
Дата: | 16.09.23 13:15 | ||
Оценка: | 3 (1) |
Р>>const std = @import("std");
Р>>pub fn readln(prompt: []const u8) ![]u8 {
Р>> const allocator: std.mem.Allocator = std.heap.page_allocator;
Р>> const stdin = std.io.getStdIn();
Р>> std.debug.print("{s}", .{ prompt });
Р>> var input = std.ArrayList(u8).init(allocator);
Р>> errdefer input.deinit(); // <- вот тут заменил простой дереф и аллокатор другой
Р>> try stdin.reader().streamUntilDelimiter(input.writer(), '\n', 1024);
Р>> return input.items;
Р>>}
Р>>
fn userFactory(data: anytype) User {
const T = @TypeOf(data);
return .{
.id = if (@hasField(T, "id")) data.id else 0,
.power = if (@hasField(T, "power")) data.power else 0,
.active = if (@hasField(T, "active")) data.name else true,
.name = if (@hasField(T, "name")) data.name else "",
};
}
pub const User = struct {
id: u64,
power: u64,
active: bool,
name: [] const u8,
};